【问题标题】:onActivityResult not call in the FragmentonActivityResult 不在 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 但两者都未定义?

标签: android android-activity android-fragments android-tabhost onactivityresult


【解决方案1】:

这不起作用的原因是因为您从嵌套片段中调用startActivityForResult()。 Android 足够聪明,可以将结果路由回Activity 甚至Fragment,但不会路由到嵌套的Fragment,因此您没有收到回调。 (更多关于为什么这不起作用herestackoverflow 的信息)

现在为了使其正常工作,我建议您手动将回调路由到 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);
}
【解决方案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);
                }
        
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2013-11-29
          • 2012-11-29
          • 2019-07-08
          • 1970-01-01
          • 1970-01-01
          • 2019-11-19
          • 2016-10-22
          • 2020-11-15
          • 2019-07-20
          相关资源
          最近更新 更多