android-fragments 返回空值的getParentFragment

webghufk  于 2022-11-13  发布在  Android
关注(0)|答案(5)|浏览(171)

我有一个Fragment,它有一个FrameLayout。第一个片段(A)在它的Framelayout中加载另一个片段(B)。当我从内部片段(B)调用getParentFragment时,我得到null。应该如何正确使用这个方法?

wa7juj8i

wa7juj8i1#

getParentFragment()是在API级别17(Android 4.2)中引入的。Android 4.2引入了嵌套片段(包含其他片段的片段)的概念。如果片段的父级是Activity,则调用此方法会导致null。
看看这个。
如果你正在使用支持库,那么你可以使用getParent(),在做片段事务的时候,你可能需要使用getChildFragmentManager()。

izj3ouym

izj3ouym2#

在我的例子中,虽然我的fragmentA被嵌套在fragmentB中,但是在fragmentA中调用getParentFragment后仍然得到null。最后我发现在fragmentB中应该使用getChildFragmentManager而不是getFragmentManager。
检查此What is difference between getSupportFragmentManager() and getChildFragmentManager()?

lx0bsm1f

lx0bsm1f3#

有一件事很有帮助,那就是在创建适配器时使用getChildFragmentManager()
如果不使用适配器,则在执行事务时使用getChildFragmentManager()
不建议使用setTargetFragment(),因为它会在片段的moveState()上产生错误(因为片段应绑定到FragmentManager)

eivnm1vs

eivnm1vs4#

我遇到了同样的问题,并通过在您的父片段中使用getChildFragmentManager()托管第二个片段来修复这些问题,然后您将不会获得空值...
父片段

SignUpFragment signUpFragment = new SignUpFragment();
    getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.contentPanel, signUpFragment)
            .addToBackStack(null).commit();

子片段:我使用的是对话框

HospitalCardDialog hospitalCardDialog = new HospitalCardDialog();
    hospitalCardDialog.show(getChildFragmentManager(), "");
6ljaweal

6ljaweal5#

只是以防有人在fragment内使用viewpager并面临同样的问题。例如,如果您希望在子fragment内使用getParentFragment()的父viewmodel。您需要对fragment而不是fragmentActivity使用构造函数
请勿使用此

public PagerAdapter(@NonNull FragmentActivity fragmentActivity, Bundle arguments) {
    super(fragmentActivity);
    this.arguments = arguments;
}

但是用这个

private static class PagerAdapter extends FragmentStateAdapter {

        private final Bundle arguments;

        public PagerAdapter(@NonNull Fragment fragment, Bundle arguments) {
            super(fragment);
            this.arguments = arguments;
        }

        @NonNull
        @Override
        public Fragment createFragment(int position) {
            switch (position) {
                case 1:
                    return MeterPhotoUploadFragment.newInstance(arguments);
                default:
                    return ServiceConnectionDetailsFragment.newInstance(arguments);
            }
        }

        @Override
        public int getItemCount() {
            return 2;
        }
    }

用法:

PagerAdapter pagerAdapter = new PagerAdapter(this, getArguments());

相关问题