在Viewpager中的一个Fragment中添加一个ViewPager

在Viewpager中的一个Fragment中添加一个ViewPager,第1张

在现在很多的应用程序中都会用到ViewPager嵌套ViewPager的情况,比如掌上英雄联盟。

如图,下面的四个按钮是控制一个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即可解决。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/7873062.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存