ViewPager和动态片段:重新实例化可提供NPE

Aeldred

我在Android中遇到了ViewPager和ViewPagerAdapter的问题。我将viewpager与2个静态片段一起使用(一个使用textEdit,第二个使用listview)。Theyr的表现还不错。但是我对动态的第三个片段有疑问。它使用相机,必须根据场景进行实例化,销毁和重新实例化。因此,ViewPagerAdapter可以包含2或3个frament。当我重新安装第三个片段时,出现了问题,我在OnCreateView()之后得到了NPE(此方法后主布局视图为null,但在方法内部不为null)。

有用于主要活动的代码:

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

setupViewPager():

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);
    }
}

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

public class TabFragment extends Fragment implements SurfaceHolder.Callback,
    GLSurfaceView.Renderer {

private static final String LOGCAT = "WEB_RTC_VISIO";

private HomeActivity mApp;
private String p1;
private String p2;
private String p3;
private String p4;

private VideoSource mLocalVideoSource;
private VideoRenderer.Callbacks mLocalRenderer;
private VideoRenderer.Callbacks mRemoteRenderer;
private GLSurfaceView mVideoView;
private SurfaceView mDrawView;
private SurfaceHolder mDrawHolder;
private ImageView mCursor;
private String mBgBytesString;
private ImageView mImgView;

private View mV;

public TabFragment() {
    // Required empty public constructor
}

public void setApp(HomeActivity app) {
    mApp = app;
}

public void setParams(String p1, String p2, String p3,
                      String p4) {
    this.p1= p1;
    this.p2= p2;
    this.p4= p4;
    this.p3= p3;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    mV = inflater.inflate(R.layout.third_layout, container, false);
    return mV;
}

@Override
public void onDetach() {
    super.onDetach();

}

public void setupView() {
    RequestUserPermission requestUserPermission = new RequestUserPermission(mApp);
    requestUserPermission.verifyStoragePermissions();
    mImgView = (ImageView) mV.findViewById(R.id.img_display); // NPE HERE
    TextView mTest1= (TextView) mV.findViewById(R.id.test1);
    mRequestLabelTextView.setText("test 1");
    TextView mTest2= (TextView) mV.findViewById(R.id.test2);
    mEquipmentSerialTextView.setText("test 2");
    // View that displays the view from the camera
    mVideoView = (GLSurfaceView) mV.findViewById(R.id.gl_surface);
    // View that displays the cursor and drawing associated
    mDrawView = (SurfaceView) mV.findViewById(R.id.draw_surface);
    mDrawHolder = mDrawView.getHolder();
    mDrawHolder.setFormat(PixelFormat.TRANSPARENT);
    mDrawHolder.addCallback(this);
    // Image of the cursor
    mCursor = (ImageView) mV.findViewById(R.id.mouseCursor);
    // Some more inits
}
public void startWork() {
//SOME WORK
}
}

因此,第一个实例是可以的,但是第二个实例上,我得到了NPE上的ImageView ...有人可以帮助我理解此问题吗?

提前致谢 !

阿什什

尝试FragmentStatePagerAdapter使用FragmentPagerAdapter它会解决很多问题。希望它也能为您服务。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Android ViewPager和片段序列化

来自分类Dev

ViewPager的第二个片段尚未实例化

来自分类Dev

不重新加载片段ViewPager

来自分类Dev

ViewPager和片段问题

来自分类Dev

Viewpager和片段问题

来自分类Dev

BottomSheet与ViewPager和片段?

来自分类Dev

ViewPager和片段错误

来自分类Dev

BottomSheet与ViewPager和片段?

来自分类Dev

Viewpager和片段问题

来自分类Dev

持久片段和viewpager

来自分类Dev

片段实例化崩溃

来自分类Dev

刷新/重新加载/重新实例化android选项卡系统中的片段

来自分类Dev

仅一次实例化ViewPager的所有片段有多糟糕?

来自分类Dev

如何以编程方式在ViewPager的实例化片段中实现自定义ListView

来自分类Dev

Android中的片段和ViewPager

来自分类Dev

ViewPager和更新片段

来自分类Dev

如何动态刷新viewpager中的片段?

来自分类Dev

在ViewPager中动态更改片段内容

来自分类Dev

ViewPager中的动态内部片段重叠

来自分类Dev

Android ViewPager +具有动态ListViews的片段

来自分类Dev

用片段动态设置ViewPager的高度

来自分类Dev

ViewPager,动态添加片段不起作用

来自分类Dev

扩展与重新实例化

来自分类Dev

无法实例化片段MainFragment

来自分类Dev

无法实例化片段-InstantiationException

来自分类Dev

无法实例化片段MainFragment

来自分类Dev

Android:“无法实例化片段”

来自分类Dev

动态实例化对象

来自分类Dev

片段对片段通信NPE