如图,下面的四个按钮是控制一个ViewPager,在使用到ViewPager嵌套ViewPager的时候,外层的ViewPager必须设置不能滑动,以免造成两个ViewPager产生冲突,在这里的第一个Fragment中也用到了一个ViewPager,并结合TabLayout实现一个ViewPager的使用。我们来详细介绍这一个Fragment中的ViewPager。
tabIndicatorHeight是设置TabLayout下的标志线的大小,在设置为0dp,是为了隐藏标志线。tabMode是设置tablayout是固定或是滑动的,fixed为固定,scrollable为可以滑动。app:tabGravity="fill"设置布满。tabSelectedTextColor设置tab选中文字的颜色,tabTextColor设置tab为选中的颜色。
为ViewPager设置适配器,ViewPager设置的是FragmentPagerAdapter,并重写getItem(),getCount(),getPageTitle()这三个方法。mTablayout.setupWithViewPager(mViewPager)将tablayout与viewpager关联在一起。
为tablayout设置OnTabSelectedListener和为viewpager设置OnPageChangeListener。
在这里要特别说明的是mViewPager.setAdapter(new FragmentPagerAdapter(getChildFragmentManager()) 中需要用到的是getChildFragmentManager(),而不是getSupportFragmentManager。
设置为getSupportFragmentManager()的时候,在外面的viewpager滑动后里面的viewpager就显示不了。
为viewpager添加单击事件实现界面跳转的实现方法如下:
通过事件的传递关系,需要在instantiateItem里面逐层设置onclick事件
@Override
public Object instantiateItem(View collection, final int pos) {
LayoutInflater inflater = (LayoutInflater) collection.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
View page = inflater.inflate(R.layout.YOUR_PAGE, null)
page.setOnClickListener(new OnClickListener(){
public void onClick(View v){
Log.i("TAG", "This page was clicked: " + pos)
}
})
((ViewPager) collection).addView(page, 0)
return page
}
2.指定跳转的页面:
cancelButton = (Button) findViewById(R.id.cancel_button)
signInButton = (Button) findViewById(R.id.sign_in_button)
切换fragment时出现空白页面。
问题原因:onCreateView每次都调用导致的,这样fragment每次都会设置新的view,而之前的view并没有被回收,这就导致了这个问题。
解决方案:1,预加载,viewpager.setOffscreenPageLimit(num)num为你的页面的个数
或者复制viewpager源码,修改字段private static final int DEFAULT_OFFSCREEN_PAGES =num//默认是1 改成你预加载页面个数
2,基类移除view,再重新添加
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO 自动生成的方法存根if(contentView !=null) {
ViewGroup parent = (ViewGroup) contentView.getParent()
if(parent !=null) {
parent.removeView(contentView)
}
return contentView
}
returncontentView = inflater.inflate(R.layout.fragment,
container, false)
}
3,重写public void destroyItem(ViewGroup container, int position, Object object),去掉super.destroyItem(container, position, object)
4,如果fragment里面嵌套了viewpager,里面的viewpager加载网络数据时也会出现空白页面,可以把FragmentStatePagerAdapter改成FragmentPagerAdapter即可解决。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)