android - onActivityResult 不在 Fragment 中调用

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

应用程序的结构是这样的:

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。在首页( fragment 的实际内容)

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 中返回。

startActivityForResult(intent, REQUEST_CAMERA);

public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d("test1", "result2");
        super.onActivityResult(requestCode, resultCode, data);
}

如何在 UploadType 触发 onActivityResult?感谢您的帮助。

最佳答案

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

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

关于android - onActivityResult 不在 Fragment 中调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28496682/

相关文章:

android - 在 Android 中同时使用两个 MouseArea

android - 为什么我得到 : "preserveIconSpacing is private" error

android - 从广播接收器启动 Activity 会显示默认 Activity

安卓磨损 : How does it work an activity life cycle?

android - fragment 中的按钮单击不起作用

android - 在 Android 上关闭键盘后返回沉浸模式

Android Sqlite 应用程序在 Android pie 及更高版本中崩溃给出 SQLiteDiskIOException(代码 522)

android - 在 viewpager 上滑动时,选项卡选择器无法在上一个选项卡上单击

fragment 上 ViewPager 中的 Android GestureDetector

android - 防止应用程序在方向更改期间重新启动