android tab的实现方案

参考博客这里写链接内容

上述博客中提出了四种实现方式
1、ViewPager+Button实现Tab
这种,我以前只用来做轮播图,因为ViewPager的内容改起来真的很麻烦
2、Fragment切换+button实现Tab
这种方式还不错,但是我总考虑内存占用是不是过大,而且切换过于麻烦
3、FragmentPagerAdapter+ViewPager+Button实现Tab
由于FragmentPagerAdapter的官方建议(这个Adapter意味着呈现的每一个fragment 页面都是持久化保存到fragment manager 中,它最适合于一些静态页面(比如不需要请求网络数据)),此方案更适合静态页面,如图片轮播
但因为很多人用,就涉及到一个问题:强制刷新
写代码的时候我还发现了一个东西FragmentStatePagerAdapter,参考博客之后发现他们俩其实是一样的,不过适用的fragment数量不同
4、ViewPagerIndicator+ViewPager+Button实现Tab【开源】
5、radioGroup+fragment【此方式不常用】
原理还是用radioButton做tab,点击载入fragment,可以说是第二种方式的改版,同二
6、fragment+TabHost
利用tabHost的TabSpec
7、ViewPager+TabLayout
TabLayout是design库提供的控件,可以方便的使用指示器,功能类似ViewPagerIndicator. 所以要和ViewPager结合使用
在实际使用过后我做了一些批注

<android.support.design.widget.TabLayout
        android:id="@+id/tl_tab"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        app:tabGravity="fill"
        app:tabIndicatorColor="@color/colorPrimaryDark"
        app:tabMode="scrollable"
        app:tabSelectedTextColor="@color/colorAccent"
        app:tabTextColor="@color/colorPrimary" />

xml种TabLayout的属性有两个必须说说
app:tabMode取值为scrollable(滚动)和fixed(等分)
scrollable时显示如下
这里写图片描述
tab的长度取决于tab内文字的长度,过长时也能完全显示,而且嗯,不管如何设置app:tabGravity都不能居中
fixed时显示情况根据app:tabGravity的取值
内容过长时会折行显示,或者超出部分…
app:tabGravity=fill时
这里写图片描述
app:tabGravity=center时
这里写图片描述
需要注意的是不论如何设置TabLayout的滑动都不能一次滑一个tab。
而设置为fixed时当其中一个tab内容超出了,app:tabGravity的两个值显示效果都为fill,然后我做了个实验,设置app:tabGravity=center改变文字大小
这里写图片描述
这里写图片描述
这里写图片描述
他这个padding是根据文字变化的,具体多少不设置的话会根据你文字测算
app:tabPadding//如果超过的tab本身的宽度,文字就会被挤没了
app:app:tabMinWidth="70dp"和tabMaxWidth是管控单个tab宽度的
app:tabIndicatorHeight//设置导航条的高度

在activity代码中

//此处为adapter中装填的页面
var mFragemnts:ArrayList<Fragment> = ArrayList<Fragment>()
  //设置adapter
  var adapterPager:MyPageAdapter = MyPageAdapter(supportFragmentManager)
  adapterPager.setFragments(mFragemnts)
  mViewPager?.adapter = adapterPager
  //new底部tab,这个经过测试发现是不必要的所以注释了
 /* for(i in 0..1) {
      mTabLayout?.addTab(mTabLayout?.newTab() as TabLayout.Tab)
  }*/
  //关联viewpager
  mTabLayout?.setupWithViewPager(mViewPager)
  //设置tab
  mTabLayout?.getTabAt(0)?.setText("post")
  mTabLayout?.getTabAt(1)?.setText("get")
  mTabLayout?.getTabAt(2)?.setText("setting")

最后还有个懒加载优化
补充:
8、tabHost+LinearLayout
与6中的方法相比更简单,耦合度高,不适合复杂页面的堆砌
9、FragmentTabHost
google提出替换TabHost的操作,但tab切换时资源回收容易出问题,如当页面层级较深或其他fragment占用较多资源容易发生oom,极端做法是切换即回收,我也做过一个方案,只缓存前一个和后一个fragment,这样只保证有三个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值