Android getParentFragment() 在 Fragment 内的 ViewPager 中返回 null
Posted
技术标签:
【中文标题】Android getParentFragment() 在 Fragment 内的 ViewPager 中返回 null【英文标题】:Android getParentFragment() returns null in ViewPager within a Fragment 【发布时间】:2017-03-05 12:06:45 【问题描述】:我有一个Activity
,其中包含一个Fragment
和一个ViewPager
。然后我在 ViewPager 中调用 Fragment
的方法。但是如果那个 Fragment 然后调用 getParentFragment()
,它会返回 null。
为什么getParentFragment()
为空?
包含 ViewPager 的主 Fragment:
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();
嵌套的 Fragment(在 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;
如果需要更多代码,请告诉我。感谢您的帮助。
【问题讨论】:
你调用哪个片段?该片段可能为空。请记住,视图页面仅从当前可见页面初始化 +/-1 个片段。 您何时何地调用 testMethod? @FlorescuGeorgeCătălin 我知道,但是如果片段为空,它怎么可能没有崩溃,我仍然看到日志?它通过了isDetached()
检查。
@AhmedGhonim 方法testMethod()
在附加后由MyFragment
调用。
我认为是因为没有抛出任何异常,只是记录。
【参考方案1】:
就我而言,我使用的是 FragmentManager 而不是导致此问题的 ChildFragmentManager。
【讨论】:
天哪。你真是天才。替换为子片段时,我将父片段中的“getFragmentManager()”更改为“getChildFragmentManager()”。它解决了我的问题。【参考方案2】:我找到了答案。如果isDetached()
为真,并不意味着getParentFragment()
不为空。
所以不是之前检查testMethod()
,而是新代码:
public void testMethod()
if (isDetached() && getParentFragment() != null)
return;
...
我现在也在Fragment0
内的onStart()
方法中再次调用相同的方法,其中getParentFragment()
不应为空。
【讨论】:
以上是关于Android getParentFragment() 在 Fragment 内的 ViewPager 中返回 null的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )