2016-12-26 46 views
0

我在Android中遇到ViewPager和ViewPagerAdapter的问题。 我使用一个viewpager与2静态片段(一个使用textEdit和第二个使用列表视图)。他们工作得很好。 但我有一个动态的第三个片段的问题。 它使用相机,必须立即执行,销毁,重新实施。所以,ViewPagerAdapter可以包含2或3个分档。 当我重新初始化第三个片段时,出现问题,我在OnCreateView()后得到了一个N​​PE(主布局视图在此方法后为空,但在方法内不为null)。ViewPager和动态碎片:再次instaciation给NPE

没有为主要活动代码:)

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

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

在此先感谢!

+0

你为什么要摧毁它? –

+0

因为我需要禁止用户在不需要的时候使用3片段,并且释放相机资源。 然后,为了将来,我需要使用相机创建2个不同的片段,取决于情况取得第三个片段的地方... – Aeldred

回答

1

尝试使用FragmentStatePagerAdapter而不是FragmentPagerAdapter它将解决许多问题。希望它也能为你工作。

+0

我试过了,它的工作很完美。 非常感谢,我不认为FragmentStatePagerAdapter完全适合这种工作! 谢谢! – Aeldred

+0

随时欢迎**:)** – Ashish