平常在看Android书的时候,觉得这个知识点我已经掌握不需要记录,或者在看别人写的blog的时候,发现他所讲的知识我已经有了一个印象,下次要用到这个知识的时候,我只有找到这篇blog就可以了,但是往往,这些基础的部分,因为内容多且杂,很长时间不用就会忘记,blog上的知识点也是,往往就是这篇blog找不到。so,我还是把在使用过程中遇到的知识点简单的记录一下,方便之后如果在忘记的回顾。
在官网的TabLayout官方API中对这个TabLayout
控件的使用有简单的说明。我们可以单独得为TabLayout
添加Tab
控件:
这样的效果如图:
我们能够,看到在上面三个Tab
显示。但是我们在一般情况下都是和ViewPager
这个控件一起使用。在官方指导文档中,也提供了对应的布局提示:
但是在个人使用的时候,也可以使用如下布局:
<android.support.design.widget.TabLayout android:id="@+id/tablayout" android:layout_width="match_parent" android:layout_height="wrap_content"></android.support.design.widget.TabLayout> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v4.view.ViewPager>这两种布局简单的实现出来的效果看起来都是差不多的,具体有什么不同暂时还不清楚。等之后什么时候弄清楚了在另行说明。但在仅仅这样写布局还是实现不了上面图片所示的效果。在官方的文档上有说需要调用setupWithViewPager(ViewPager)
来为TabLayout
设置ViewPager
。在调用这个方法后,需要使用setAdapter(PageAdapter)
来为ViewPager
设置适配器。
适配器代码:(比较简单的实现)
public class ViewPagerAdapter extends FragmentPagerAdapter { PRivate List<Fragment> fragments; private List<String> titles; /** * 构造方法 * @param manager * @param fragments */ public ViewPagerAdapter(FragmentManager manager, List<Fragment> fragments,List<String> titles){ super(manager); this.fragments=fragments; this.titles=titles; } @Override public int getCount() { if (fragments!=null){ return fragments.size(); } return 0; } @Override public Fragment getItem(int position) { if (fragments!=null){ return fragments.get(position); } return null; } @Override public CharSequence getPageTitle(int position) { if (titles!=null){ return titles.get(position); } return ""; }}MainActivity代码:
public class MainActivity extends AppCompatActivity { private ViewPager mViewPager; private TabLayout mTabLayout; private FragmentPagerAdapter mAdapter; private List<Fragment> fragments; private List<String> titles; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mViewPager = (ViewPager) findViewById(R.id.viewpager); mTabLayout = (TabLayout) findViewById(R.id.tablayout); mTabLayout.setupWithViewPager(mViewPager); fragments = new ArrayList<Fragment>(); Fragment aFragment = AFragment.getInstance(); Fragment bFragment = BFragment.getInstance(); Fragment cFragment = CFragment.getInstance(); Fragment dFragment = DFragment.getInstance(); Fragment eFragment = EFragment.getInstance(); fragments.add(aFragment); fragments.add(bFragment); fragments.add(cFragment); fragments.add(dFragment); fragments.add(eFragment); titles = new ArrayList<String>(); titles.add("A"); titles.add("B"); titles.add("C"); titles.add("D"); titles.add("E"); mAdapter = new ViewPagerAdapter(getSupportFragmentManager(), fragments, titles); mViewPager.setAdapter(mAdapter); mTabLayout.setTabMode(TabLayout.MODE_FIXED); }}所有的Fragment
的的布局非常简单,就是一个居中的TextView
,这样简单的代码就能够实现如下动图的效果
so easy !不是吗?
因为很久没有用这个控件了,我一直记得是ViewPager
和TabLayout
两个控件的嵌套使用,因此我尝试把ViewPager
嵌套在TabLayout
中使用,很高兴的去运行了一把,以为能够成功,自己还是too young too simple。studio
立马就给我报如下的错误:
错误的信息也说得很明白了,在TabLayout
控件中只能够放TabItem
控件。
之前也写过一片关于FragmentTabLayout
控件的简单使用,在那篇文章中,我说道,在FragmentTabLayout
中的Fragment不需要进行懒加载,因为FragmentTabLayout
没有预加载这一个概念,但是在这个情况下,如果每个界面都有大量的请求,最好还是使用Fragment
的懒加载。
新闻热点
疑难解答