我的Activity
包含Fragment
ViewPager
。然后我在ViewPager中调用Fragment
的方法。但是如果那个Fragment然后调用getParentFragment()
,它将返回null。
为什么getParentFragment()
为空?
包含ViewPager的主要片段:
public class MyFragment extends Fragment {
private TabLayout mTabLayout;
private ViewPager mViewPager;
private ViewPagerAdapter mAdapter;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
View view = getView();
// Setup the ViewPager
mViewPager = (ViewPager) view.findViewById(R.id.container);
ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager(), getActivity());
mViewPager.setAdapter(adapter);
//setupViewPager(mViewPager);
// Setup the TabLayout
mTabLayout = (TabLayout) view.findViewById(R.id.tabs);
mTabLayout.setupWithViewPager(mViewPager);
}
// This method is called from Activity.
public void callNestedFragment() {
if (isDetached()) {
return;
}
// This fragment cannot be null, because it doesn't crash here. (this is just a sample).
((Fragment0) mViewPager.getItem(0)).testMethod();
}
}
嵌套片段(在mViewPager
内):
public class Fragment0 extends Fragment {
...
public void testMethod() {
if (isDetached()) {
return;
}
// Why is getParentFragment() null? This is the log: "Parent fragment: null"
Log.i(TAG, "Parent fragment: " + getParentFragment());
return;
}
}
ViewPagerAdapter
:
public class ViewPagerAdapter extends FragmentPagerAdapter {
private Context mContext;
public ViewPagerAdapter(FragmentManager manager, Context context) {
super(manager);
mContext = context;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new Fragment0();
case 1:
return new Fragment1();
case 2:
return new Fragment2();
case 3:
return new Fragment3();
case 4:
return new Fragment4();
}
return null;
}
@Override
public int getCount() {
return 5;
}
}
如果需要更多代码,请告知我们。谢谢你的帮助。
答案 0 :(得分:1)
我找到了答案。如果isDetached()
为真,则表示getParentFragment()
不为空。
因此,不是先前的testMethod()
检查,而是新代码:
public void testMethod() {
if (isDetached() && getParentFragment() != null) {
return;
}
...
}
我现在也在onStart()
内的Fragment0
方法中再次调用相同的方法,其中getParentFragment()
不应该为空。
答案 1 :(得分:1)
在我的情况下,我使用的是FragmentManager而不是ChildFragmentManager,这导致了此问题。
答案 2 :(得分:0)
我试图重新构建你的例子,它在我的项目中运行良好。您是否尝试使用<html>
<div style="z-index: 0">
<img src="#" width="350" style="position: absolute;" />
<canvas width="350" style="border: thick; position: absolute"></canvas>
</div>
<div style="z-index: 10">
<input type="file" />
</div>
</html>
getParentFragment()
方法拨打onCreate
?它有用吗?
P.S。我认为这个答案应该是一个评论,但我没有足够的声誉来发表评论。