onActivityResult不在Fragment中调用

use*_*104 10 android android-tabhost android-fragments android-activity onactivityresult

应用程序的结构如下:

tabHost (in Activity) -> contains -> TabFragment(extend base container fragment)
Run Code Online (Sandbox Code Playgroud)

1.活动中的代码:

tabHost.addTab(
                tabHost.newTabSpec("home").setIndicator("",
                        getResources().getDrawable(R.drawable.btn_home)),
                HomeFragment.class, null);
Run Code Online (Sandbox Code Playgroud)

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

4.在Home(片段的实际内容)

UploadType fragment = new UploadType();
                    Bundle bundle = new Bundle();
                    bundle.putString("form_type", "request");
                    fragment.setArguments(bundle);
                    ((BaseContainerFragment)getParentFragment()).replaceFragment(fragment, true);
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

如何在UploadType上触发onActivityResult?感谢帮助.

Jer*_*ols 31

这不起作用的原因是因为您startActivityForResult()在嵌套片段中进行调用.Android足够聪明,可以将结果路由回一个Activity甚至一个Fragment,但不是嵌套,Fragment因此你没有得到回调.(有关为什么在此处或在stackoverflow上不起作用的更多信息)

现在为了使它工作,我建议你手动将回调路由到ChildFragment(= UploadType)中的ParentFragment(= BaseContainerFragment):

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);
}
Run Code Online (Sandbox Code Playgroud)


Kas*_*ala 13

就我而言,我已经完成了在我的代码中添加以下代码 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);
    }
}
Run Code Online (Sandbox Code Playgroud)


goo*_*oid 9

在你的Activity Override onActivityForResult()中

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }
Run Code Online (Sandbox Code Playgroud)

现在在你的片段中,你可以在里面得到活动结果

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      Log.d("test1", "result2");
    }
Run Code Online (Sandbox Code Playgroud)

确保当你正在调用启动ActivityForResult时,它应该是这样的

startActivityForResult(intent, REQUEST_CAMERA);
Run Code Online (Sandbox Code Playgroud)


Yog*_*ity 5

对于导航架构组件的 NavHostFragment

如果您使用的是单个活动并且在 里面有片段NavHostFragment,则存在onActivityResult()子片段NavHostFragment未被调用的问题。

要解决此问题,您需要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) }
}
Run Code Online (Sandbox Code Playgroud)