startActivityForResult在fragment中的回调
时间: 2024-01-09 08:16:08 浏览: 36
当在Fragment中调用startActivityForResult方法启动一个Activity后,当Activity返回结果时,回调会首先到达FragmentActivity的onActivityResult方法。然而,由于FragmentActivity的一个BUG,只会回调最外层的Fragment的onActivityResult方法,而不会回调嵌套的Fragment的onActivityResult方法。这就导致了在嵌套Fragment中使用startActivityForResult方法时无法正确处理回调结果。
相关问题
startActivityForResult已经失效
是的,从 Android 11 开始,`startActivityForResult`已经被标记为过时 (deprecated),不再建议使用。这是因为 Android 11 引入了一种新的 Activity 启动方式,称为 `registerForActivityResult`,它提供了更好的类型安全和更简洁的 API。
`registerForActivityResult`方法使用起来非常简单,只需要在 Activity 或 Fragment 中注册一个回调来处理结果,然后启动一个 Activity。当 Activity 返回结果时,会自动调用回调方法来处理结果。以下是一个示例:
```java
// 在 Activity 或 Fragment 中注册回调
ActivityResultLauncher<String> launcher = registerForActivityResult(
new ActivityResultContracts.GetContent(),
new ActivityResultCallback<Uri>() {
@Override
public void onActivityResult(Uri uri) {
// 处理结果
}
});
// 启动 Activity
launcher.launch("image/*");
```
在这个例子中,我们使用 `ActivityResultContracts.GetContent()` 启动一个获取文件内容的 Activity,并在回调函数中处理返回的 URI。
总的来说,使用 `registerForActivityResult` 可以让代码更加简洁和类型安全,所以建议尽快升级到这个 API。
android fragment onactivityresult
在 Android 中,Fragment 也可以通过 startActivityForResult() 方法启动另外一个 Activity,并通过 onActivityResult() 方法接收返回的数据。在 Fragment 中使用 startActivityForResult() 方法时,要注意以下几点:
1. 需要在 Fragment 中重写 onActivityResult() 方法,而不是在 Fragment 所依附的 Activity 中重写。
2. 在 Fragment 中启动 Activity 时,需要使用 getActivity().startActivityForResult() 方法,而不是直接使用 startActivityForResult() 方法。
3. 在 Fragment 中接收返回数据时,需要调用 getActivity().onActivityResult() 方法,而不是直接调用 Fragment 的 onActivityResult() 方法。
例如,以下是一个在 Fragment 中使用 startActivityForResult() 方法的示例:
```
public class MyFragment extends Fragment {
private static final int REQUEST_CODE = 100;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_my, container, false);
}
public void startMyActivity() {
Intent intent = new Intent(getActivity(), MyActivity.class);
startActivityForResult(intent, REQUEST_CODE);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
String result = data.getStringExtra("result");
// 处理返回数据
}
}
@Override
public void onResume() {
super.onResume();
if (getActivity() instanceof MyActivity) {
((MyActivity) getActivity()).setResult(Activity.RESULT_OK, new Intent().putExtra("result", "Hello World!"));
getActivity().finish();
}
}
}
```
在上面的示例中,我们在 Fragment 中启动了一个名为 MyActivity 的 Activity,并在 Activity 中模拟了返回数据的操作。当 Activity 被销毁时,会自动回调 Fragment 的 onActivityResult() 方法,我们可以在该方法中接收返回的数据并进行处理。