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 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)