我有一个Fragment,它有一个FrameLayout。第一个片段(A)在它的Framelayout中加载另一个片段(B)。当我从内部片段(B)调用getParentFragment时,我得到null。应该如何正确使用这个方法?
Fragment
FrameLayout
getParentFragment
null
wa7juj8i1#
getParentFragment()是在API级别17(Android 4.2)中引入的。Android 4.2引入了嵌套片段(包含其他片段的片段)的概念。如果片段的父级是Activity,则调用此方法会导致null。看看这个。如果你正在使用支持库,那么你可以使用getParent(),在做片段事务的时候,你可能需要使用getChildFragmentManager()。
izj3ouym2#
在我的例子中,虽然我的fragmentA被嵌套在fragmentB中,但是在fragmentA中调用getParentFragment后仍然得到null。最后我发现在fragmentB中应该使用getChildFragmentManager而不是getFragmentManager。检查此What is difference between getSupportFragmentManager() and getChildFragmentManager()?
lx0bsm1f3#
有一件事很有帮助,那就是在创建适配器时使用getChildFragmentManager()。如果不使用适配器,则在执行事务时使用getChildFragmentManager()。不建议使用setTargetFragment(),因为它会在片段的moveState()上产生错误(因为片段应绑定到FragmentManager)
getChildFragmentManager()
setTargetFragment()
moveState()
eivnm1vs4#
我遇到了同样的问题,并通过在您的父片段中使用getChildFragmentManager()托管第二个片段来修复这些问题,然后您将不会获得空值...父片段
SignUpFragment signUpFragment = new SignUpFragment(); getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.contentPanel, signUpFragment) .addToBackStack(null).commit();
子片段:我使用的是对话框
HospitalCardDialog hospitalCardDialog = new HospitalCardDialog(); hospitalCardDialog.show(getChildFragmentManager(), "");
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());
5条答案
按热度按时间wa7juj8i1#
getParentFragment()是在API级别17(Android 4.2)中引入的。Android 4.2引入了嵌套片段(包含其他片段的片段)的概念。如果片段的父级是Activity,则调用此方法会导致null。
看看这个。
如果你正在使用支持库,那么你可以使用getParent(),在做片段事务的时候,你可能需要使用getChildFragmentManager()。
izj3ouym2#
在我的例子中,虽然我的fragmentA被嵌套在fragmentB中,但是在fragmentA中调用getParentFragment后仍然得到null。最后我发现在fragmentB中应该使用getChildFragmentManager而不是getFragmentManager。
检查此What is difference between getSupportFragmentManager() and getChildFragmentManager()?
lx0bsm1f3#
有一件事很有帮助,那就是在创建适配器时使用
getChildFragmentManager()
。如果不使用适配器,则在执行事务时使用
getChildFragmentManager()
。不建议使用
setTargetFragment()
,因为它会在片段的moveState()
上产生错误(因为片段应绑定到FragmentManager)eivnm1vs4#
我遇到了同样的问题,并通过在您的父片段中使用
getChildFragmentManager()
托管第二个片段来修复这些问题,然后您将不会获得空值...父片段
子片段:我使用的是对话框
6ljaweal5#
只是以防有人在fragment内使用viewpager并面临同样的问题。例如,如果您希望在子fragment内使用getParentFragment()的父viewmodel。您需要对fragment而不是fragmentActivity使用构造函数
请勿使用此
但是用这个
用法: