Android getParentFragment()在Fragment中的ViewPager中返回null

时间:2016-10-23 17:59:01

标签: java android android-fragments nullpointerexception android-viewpager

我的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;
    }
}

如果需要更多代码,请告知我们。谢谢你的帮助。

3 个答案:

答案 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。我认为这个答案应该是一个评论,但我没有足够的声誉来发表评论。