ViewPager和动态片段:重新安装给NPE

时间:2016-12-26 09:30:35

标签: android android-fragments android-viewpager

我在Android中遇到了ViewPager和ViewPagerAdapter的问题。 我使用一个带有2个静态片段的viewpager(一个使用textEdit,第二个使用listview)。他们工作得很好。 但我的第三个片段是动态的问题。 它使用相机,必须在场景后进行实例化,破坏,重新安装。因此,ViewPagerAdapter可以包含2或3个frament。 当我重新安装第三个片段时出现问题,我在OnCreateView()之后得到一个NPE(此布局视图在此方法之后为null,但在方法内不为null)。

主要活动的代码是:

for

setupViewPager():

    mViewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager();
    mTabLayout = (TabLayout) findViewById(R.id.tabs);
    mTabLayout.setupWithViewPager(mViewPager);

创建第三个片段:

private void setupViewPager() {
    mViewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
    mTabFragmentDocument = new TabFragmentDocument();
    mTabFragmentDocument.setApp(this);
    mTabFragmentText = new TabFragmentText();
    mTabFragmentText.setApp(this);

    mViewPagerAdapter.addFragment(mTabFragmentText, AbstractDefiner.TEXT);
    mViewPagerAdapter.addFragment(mTabFragmentDocument, AbstractDefiner.DOCUMENT);
    mViewPager.setAdapter(mViewPagerAdapter);
}

要摧毁它:

                mTabFragment = new TabFragment();
                mTabFragment .setApp(this);
                mViewPagerAdapter.addFragment(mTabFragment, "THIRD");
                mViewPagerAdapter.notifyDataSetChanged();
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mViewPager.setCurrentItem(2);
                        mViewPagerAdapter.notifyDataSetChanged();
                        mTabFragment .setParams(tmp[1], tmp[2], tmp[3], tmp[4]);
                        mTabFragment .setupView();
                        mTabFragment .startWork();
                    }
                }, 1000);

然后,适配器代码:

                mViewPager.setCurrentItem(0);
                mViewPager.removeViewAt(2);
                mTabFragment .onDestroy();
                mViewPagerAdapter.remove(2);
                mViewPagerAdapter.notifyDataSetChanged();
                mTabFragment = null;

最后,第三个片段的代码:

static class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    public void remove(int index) {
        mFragmentList.remove(index);
        mFragmentTitleList.remove(index);
    }

    @Override
    public int getItemPosition(Object object) {
        return PagerAdapter.POSITION_NONE;
    }


    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

所以,第一个实例是好的,但是在第二个实例中,我获得了获取ImageView的NPE ... 有人可以帮我理解这个问题吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

尝试使用FragmentStatePagerAdapter而不是FragmentPagerAdapter它会解决许多问题。希望它也适合你。