onActivityResult 不在 Fragment 中调用
onActivityResult not call in the Fragment
应用程序的结构是这样的:
tabHost (in Activity) -> contains -> TabFragment(extend base container fragment)
1. Activity中的代码:
tabHost.addTab(
tabHost.newTabSpec("home").setIndicator("",
getResources().getDrawable(R.drawable.btn_home)),
HomeFragment.class, null);
2。 HomeFragment中的代码
(注意 HomeFragment 不是实际的功能,而是像这样的容器,它扩展了 BaseContainerFragment):
public class HomeFragment extends BaseContainerFragment {
public Home homeFrag;
private boolean mIsViewInited;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.container_fragment, null);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (!mIsViewInited) {
mIsViewInited = true;
initView();
}
}
private void initView() {
homeFrag = new Home();
replaceFragment(homeFrag, false);
}
}
3。 BaseContainerFragment
public class BaseContainerFragment extends Fragment {
public void replaceFragment(Fragment fragment, boolean addToBackStack) {
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
if (addToBackStack) {
transaction.addToBackStack(null);
}
transaction.replace(R.id.container_framelayout, fragment);
transaction.commit();
}
public boolean popFragment() {
boolean isPop = false;
if (getChildFragmentManager().getBackStackEntryCount() > 0) {
isPop = true;
getChildFragmentManager().popBackStack();
}
return isPop;
}
}
4.在首页(片段的实际内容)
UploadType fragment = new UploadType();
Bundle bundle = new Bundle();
bundle.putString("form_type", "request");
fragment.setArguments(bundle);
((BaseContainerFragment)getParentFragment()).replaceFragment(fragment, true);
5.在 UploadType 中,我称相机为 activity 但 onActivityResult 在主要 activity.
中只有 return
startActivityForResult(intent, REQUEST_CAMERA);
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("test1", "result2");
super.onActivityResult(requestCode, resultCode, data);
}
如何在 UploadType 触发 onActivityResult?感谢您的帮助。
在你的 Activity 中覆盖 ActivityForResult() 像这样
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
现在在您的片段中,您可以在其中获得 activity 结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("test1", "result2");
}
确保当你在你的 frragment 中调用 start ActivityForResult 时它应该是这样的
startActivityForResult(intent, REQUEST_CAMERA);
这不起作用的原因是您从嵌套片段中调用 startActivityForResult()
。 Android 足够聪明,可以将结果路由回 Activity
甚至 Fragment
,但不会路由到嵌套的 Fragment
,因此您得不到回调。
(有关为什么这不起作用的更多信息 here or on Whosebug)
现在,为了使其正常工作,我建议您手动将回调路由到 ParentFragment
(=BaseContainerFragment
) 中的 ChildFragment
(=UploadType
):
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Fragment uploadType = getChildFragmentManager().findFragmentById(R.id.container_framelayout);
if (uploadType != null) {
uploadType.onActivityResult(requestCode, resultCode, data);
}
super.onActivityResult(requestCode, resultCode, data);
}
在我的例子中,我通过在 MainActivity.java
中添加以下代码来完成
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
TabActivity->ActivityA->FragmentB,不行
使用一个糟糕的糟糕的方式:
ActivityA.java
public void onSelectSomething(){
...
startActivityForResult(intent, 22222);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (mFragment != null) {
mFragment.onActivityResult(requestCode, resultCode, data);
}
}
FragmentB.java
if(getActivity() instanceof ActivityA) {
((RepairerListActivity)getActivity()).onSelectSomething();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 22222) {
// do things
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Loop through all child fragments of the activity
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
// check if the current fragment is YourFragment
if (fragment instanceof YourFragment ) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
}
对于导航架构组件的 NavHostFragment
如果您使用单个 activity 并且在 NavHostFragment
中有片段,则会出现 NavHostFragment
的子片段 onActivityResult()
未被调用的问题。
要解决此问题,您需要从宿主 activity 的 onActivityResult()
内部手动调用子片段的 onActivityResult()
。主机 activity 是托管您的 NavHostFragment
.
的 activity
这是您的主机 activity 的 onActivityResult()
的 Kotlin 代码:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val navHostFragment = supportFragmentManager.findFragmentById(R.id.your_nav_host_fragment)
val childFragments = navHostFragment?.childFragmentManager?.fragments
childFragments?.forEach { it.onActivityResult(requestCode, resultCode, data) }
}
应用程序的结构是这样的:
tabHost (in Activity) -> contains -> TabFragment(extend base container fragment)
1. Activity中的代码:
tabHost.addTab(
tabHost.newTabSpec("home").setIndicator("",
getResources().getDrawable(R.drawable.btn_home)),
HomeFragment.class, null);
2。 HomeFragment中的代码 (注意 HomeFragment 不是实际的功能,而是像这样的容器,它扩展了 BaseContainerFragment):
public class HomeFragment extends BaseContainerFragment {
public Home homeFrag;
private boolean mIsViewInited;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.container_fragment, null);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (!mIsViewInited) {
mIsViewInited = true;
initView();
}
}
private void initView() {
homeFrag = new Home();
replaceFragment(homeFrag, false);
}
}
3。 BaseContainerFragment
public class BaseContainerFragment extends Fragment {
public void replaceFragment(Fragment fragment, boolean addToBackStack) {
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
if (addToBackStack) {
transaction.addToBackStack(null);
}
transaction.replace(R.id.container_framelayout, fragment);
transaction.commit();
}
public boolean popFragment() {
boolean isPop = false;
if (getChildFragmentManager().getBackStackEntryCount() > 0) {
isPop = true;
getChildFragmentManager().popBackStack();
}
return isPop;
}
}
4.在首页(片段的实际内容)
UploadType fragment = new UploadType();
Bundle bundle = new Bundle();
bundle.putString("form_type", "request");
fragment.setArguments(bundle);
((BaseContainerFragment)getParentFragment()).replaceFragment(fragment, true);
5.在 UploadType 中,我称相机为 activity 但 onActivityResult 在主要 activity.
中只有 returnstartActivityForResult(intent, REQUEST_CAMERA);
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("test1", "result2");
super.onActivityResult(requestCode, resultCode, data);
}
如何在 UploadType 触发 onActivityResult?感谢您的帮助。
在你的 Activity 中覆盖 ActivityForResult() 像这样
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
现在在您的片段中,您可以在其中获得 activity 结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("test1", "result2");
}
确保当你在你的 frragment 中调用 start ActivityForResult 时它应该是这样的
startActivityForResult(intent, REQUEST_CAMERA);
这不起作用的原因是您从嵌套片段中调用 startActivityForResult()
。 Android 足够聪明,可以将结果路由回 Activity
甚至 Fragment
,但不会路由到嵌套的 Fragment
,因此您得不到回调。
(有关为什么这不起作用的更多信息 here or on Whosebug)
现在,为了使其正常工作,我建议您手动将回调路由到 ParentFragment
(=BaseContainerFragment
) 中的 ChildFragment
(=UploadType
):
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Fragment uploadType = getChildFragmentManager().findFragmentById(R.id.container_framelayout);
if (uploadType != null) {
uploadType.onActivityResult(requestCode, resultCode, data);
}
super.onActivityResult(requestCode, resultCode, data);
}
在我的例子中,我通过在 MainActivity.java
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
TabActivity->ActivityA->FragmentB,不行
使用一个糟糕的糟糕的方式:
ActivityA.java
public void onSelectSomething(){
...
startActivityForResult(intent, 22222);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (mFragment != null) {
mFragment.onActivityResult(requestCode, resultCode, data);
}
}
FragmentB.java
if(getActivity() instanceof ActivityA) {
((RepairerListActivity)getActivity()).onSelectSomething();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 22222) {
// do things
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Loop through all child fragments of the activity
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
// check if the current fragment is YourFragment
if (fragment instanceof YourFragment ) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
}
对于导航架构组件的 NavHostFragment
如果您使用单个 activity 并且在 NavHostFragment
中有片段,则会出现 NavHostFragment
的子片段 onActivityResult()
未被调用的问题。
要解决此问题,您需要从宿主 activity 的 onActivityResult()
内部手动调用子片段的 onActivityResult()
。主机 activity 是托管您的 NavHostFragment
.
这是您的主机 activity 的 onActivityResult()
的 Kotlin 代码:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val navHostFragment = supportFragmentManager.findFragmentById(R.id.your_nav_host_fragment)
val childFragments = navHostFragment?.childFragmentManager?.fragments
childFragments?.forEach { it.onActivityResult(requestCode, resultCode, data) }
}