在5.0以前我们想要实现像网易新闻客户端那样的的Tab可以有很多种选择:
比如古老的TabHost,3.0后ActionBar所提供的Tab,以及各种成熟的Tab开源控件等,都可以直接或间接地实现Tab的效果。然而,对于这样一种使用极多的控件,Android是不会放弃将它纳入麾下的打算的,于是乎在5.0后放出的design包中Android就厚颜无耻地推出了自家官方的TabLayout控件来方便地实现类似的效果。其实这玩意跟ActionBar的Tab没什么卵的区别,只是说它更符合谷歌自家的MD设计理念,不过在实际使用中这玩意略显蛋疼,废话不多说,我们还是直接切入主题,要想使用TabLayout你就得导入Android的design包:
1 2 3 |
dependencies { compile 'com.android.support:design:22.2.0' } |
然后在你的布局里加入TabLayout就行了:
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.TabLayout android:id="@+id/ac_tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" /> </RelativeLayout> |
这里需要注意的是design包中有些资源依赖于5.0,这是不是说我们就不能使用了呢,不是的,我们可以从AppCompat获得这些资源,将当前Activity的主题设置为Theme.AppCompat或其子类即可:
1 2 3 |
<activity android:name="tablayout.TabLayoutActivity" android:theme="@style/Theme.AppCompat" /> |
当然现在你运行不会看到任何东西,因为我们没往里面家东西嘛,与ActionBar类似的是TabLayout添加Tab也很方便,只需要调用其addTab方法即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class TabLayoutActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ac_tab_layout); TabLayout tabLayout = (TabLayout) findViewById(R.id.ac_tab_layout); TabLayout.Tab tab1 = tabLayout.newTab().setText("Tab1"); tabLayout.addTab(tab1); TabLayout.Tab tab2 = tabLayout.newTab().setText("Tab2"); tabLayout.addTab(tab2); TabLayout.Tab tab3 = tabLayout.newTab().setText("Tab3"); tabLayout.addTab(tab3); } } |
运行效果如下:
非常简单,不过需要注意的是,这里的Tab类是TabLayout的一个静态内部类,并且其构造方法是包内可访问的,也就是说你无法在外部构造其实例,只能通过TabLayout的newTab方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class TabLayout extends HorizontalScrollView { // ......省去很多代码...... public static final class Tab { // ......省去很多代码...... Tab(TabLayout parent) { mPosition = -1; mParent = parent; } } public Tab newTab() { return new Tab(this); } // ......省去很多代码...... } |
addTab方法有四个不同的实现,拿参数最多的addTab(Tab tab, int position, boolean setSelected)方法来说,第一个参数tab就不说了,第二个参数position表示当前Tab需要插入的位置,其值必须小于当前TabLayout所拥有的Tab总数减一,如果大于则会报出数组下标溢出异常,这点很好理解,最后的boolean参数setSelected与其名意义一样,表示当前添加的Tab是否为选中状态,拿上面代码中的第三个tab3来说,我们修改其代码如下:
比如古老的TabHost,3.0后ActionBar所提供的Tab,以及各种成熟的Tab开源控件等,都可以直接或间接地实现Tab的效果。然而,对于这样一种使用极多的控件,Android是不会放弃将它纳入麾下的打算的,于是乎在5.0后放出的design包中Android就厚颜无耻地推出了自家官方的TabLayout控件来方便地实现类似的效果。其实这玩意跟ActionBar的Tab没什么卵的区别,只是说它更符合谷歌自家的MD设计理念,不过在实际使用中这玩意略显蛋疼,废话不多说,我们还是直接切入主题,要想使用TabLayout你就得导入Android的design包:
1 2 3 |
dependencies { compile 'com.android.support:design:22.2.0' } |
然后在你的布局里加入TabLayout就行了:
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.TabLayout android:id="@+id/ac_tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" /> </RelativeLayout> |
这里需要注意的是design包中有些资源依赖于5.0,这是不是说我们就不能使用了呢,不是的,我们可以从AppCompat获得这些资源,将当前Activity的主题设置为Theme.AppCompat或其子类即可:
1 2 3 |
<activity android:name="tablayout.TabLayoutActivity" android:theme="@style/Theme.AppCompat" /> |
当然现在你运行不会看到任何东西,因为我们没往里面家东西嘛,与ActionBar类似的是TabLayout添加Tab也很方便,只需要调用其addTab方法即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class TabLayoutActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ac_tab_layout); TabLayout tabLayout = (TabLayout) findViewById(R.id.ac_tab_layout); TabLayout.Tab tab1 = tabLayout.newTab().setText("Tab1"); tabLayout.addTab(tab1); TabLayout.Tab tab2 = tabLayout.newTab().setText("Tab2"); tabLayout.addTab(tab2); TabLayout.Tab tab3 = tabLayout.newTab().setText("Tab3"); tabLayout.addTab(tab3); } } |
运行效果如下:
非常简单,不过需要注意的是,这里的Tab类是TabLayout的一个静态内部类,并且其构造方法是包内可访问的,也就是说你无法在外部构造其实例,只能通过TabLayout的newTab方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class TabLayout extends HorizontalScrollView { // ......省去很多代码...... public static final class Tab { // ......省去很多代码...... Tab(TabLayout parent) { mPosition = -1; mParent = parent; } } public Tab newTab() { return new Tab(this); } // ......省去很多代码...... } |
addTab方法有四个不同的实现,拿参数最多的addTab(Tab tab, int position, boolean setSelected)方法来说,第一个参数tab就不说了,第二个参数position表示当前Tab需要插入的位置,其值必须小于当前TabLayout所拥有的Tab总数减一,如果大于则会报出数组下标溢出异常,这点很好理解,最后的boolean参数setSelected与其名意义一样,表示当前添加的Tab是否为选中状态,拿上面代码中的第三个tab3来说,我们修改其代码如下: