onActivityResult 不在 Fragment 中调用
Posted
技术标签:
【中文标题】onActivityResult 不在 Fragment 中调用【英文标题】:onActivityResult not call in the Fragment 【发布时间】:2015-04-14 07:44:46 【问题描述】:应用的结构是这样的:
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 中,我调用相机活动,但 onActivityResult 仅在主要活动中返回。
startActivityForResult(intent, REQUEST_CAMERA);
public void onActivityResult(int requestCode, int resultCode, Intent data)
Log.d("test1", "result2");
super.onActivityResult(requestCode, resultCode, data);
如何在 UploadType 触发 onActivityResult?感谢您的帮助。
【问题讨论】:
Fragments 不处理 onActivityResult,但是活动 试试这个 startActivityFromFragment(YourFragment.this, intent, REQUEST_CAMERA); 感谢您的帮助。那么有什么办法可以在main里面调用fragment onActivityResult函数呢?由于我已经切换了片段(从 Home() 到 UploadTab() ,我怎样才能得到那个片段?谢谢) 尝试 UploadForm.this.startActivityFromFragment 或 getActivity().startActivityFromFragment 但两者都未定义? onActivityResult is not being called in Fragment的可能重复 【参考方案1】:这不起作用的原因是因为您从嵌套片段中调用startActivityForResult()
。 android 足够聪明,可以将结果路由回Activity
甚至Fragment
,但不会路由到嵌套的Fragment
,因此您没有收到回调。
(更多关于为什么这不起作用here 或*** 的信息)
现在为了使其正常工作,我建议您手动将回调路由到 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);
【讨论】:
inthecheesefactory.com/blog/…【参考方案2】:在我的情况下,我通过在我的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);
【讨论】:
【参考方案3】:在你的 Activity Override onActivityForResult() 像这样
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
现在在您的片段中,您可以在其中获取活动结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
Log.d("test1", "result2");
确保你在片段中调用 start ActivityForResult 时应该是这样的
startActivityForResult(intent, REQUEST_CAMERA);
【讨论】:
非常感谢,我是否也应该将 onActivityResult 放入 BaseContainerFragment / HomeFragment 中? 从您调用 startActivtyForResult 的位置放置 onActivityResult 谢谢。还有一个问题,如果多个片段有 startActivityForResult 怎么办? 解决方案有效吗?如果是,则接受答案。您可以根据请求代码过滤结果,即在您的情况下为 REQUEST_CAMERA 为您的不同意图输入不同的请求代码。也关闭答案【参考方案4】:导航架构组件的NavHostFragment
如果您使用单个活动并且在NavHostFragment
中有片段,则存在NavHostFragment
的子片段的onActivityResult()
没有被调用的问题。
要解决此问题,您需要从宿主活动的onActivityResult()
内部手动调用子片段的onActivityResult()
。主机活动是托管您的NavHostFragment
的活动。
这是您的主机活动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)
【讨论】:
【参考方案5】: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
【讨论】:
【参考方案6】:@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);
【讨论】:
以上是关于onActivityResult 不在 Fragment 中调用的主要内容,如果未能解决你的问题,请参考以下文章
zxing onActivityResult 不在 Fragment 中仅在 Activity 中调用
片段 onActivityResult 方法执行调用活动 onActivityResult
onActivityResult() 在 Android 上不起作用