Android TabLayout 使用详解

TabLayout是Android 5.0以后推出的实现导航更简洁的方式

开发中常常有如下的导航功能:

tab效果图

现在我们用TabLayout、ViewPager、Fragment来实现它

具体步骤:

1. 在build.gradle中添加依赖

compile 'com.android.support:design:23.2.1'

2. 在xml中引入TabLayout、ViewPager控件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tab"
/>
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/vp"
/>
</LinearLayout>
3. 创建三个fragment,OneFragment,TwoFragment,ThreeFragment
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package pro.down.com.tab;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class OneFragment extends Fragment {
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_tab, container, false);
}
}
4. 在Activity中添加相应代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package pro.down.com.tab;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import butterknife.Bind;
import butterknife.ButterKnife;
public class MainActivity extends AppCompatActivity {
@Bind(R.id.tab) TabLayout mTab;
@Bind(R.id.vp) ViewPager mVp;
private static String TAG = "MainActivity";
private BasePageAdapter mAdapter;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
//添加fragment到viewpager中
mAdapter = new BasePageAdapter(getSupportFragmentManager());
mAdapter.addFrag(new OneFragment(), "one");
mAdapter.addFrag(new TwoFragment(), "two");
mAdapter.addFrag(new ThreeFragment(), "three");
mVp.setAdapter(mAdapter);
//为tabLayout添加相应的tab
mTab.addTab(mTab.newTab().setText("tab1").setIcon(R.mipmap.ic_launcher));
mTab.addTab(mTab.newTab().setText("tab2").setIcon(R.mipmap.ic_launcher));
mTab.addTab(mTab.newTab().setText("tab3").setIcon(R.mipmap.ic_launcher));
//为viewpager设置监听
mVp.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTab));
//为tablayout设置监听事件
mTab.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override public void onTabSelected(TabLayout.Tab tab) {
Log.d(TAG, "tab被选中时,手动设置viewpager的选中项");
mVp.setCurrentItem(tab.getPosition());
}
@Override public void onTabUnselected(TabLayout.Tab tab) {
}
@Override public void onTabReselected(TabLayout.Tab tab) {
}
});
}
}

代码中使用到的:

  • butterknife注入框架请移步
    butterknife
  • BasePageAdapter是自己二次封装的viewpage的适配器,代码如下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    package pro.down.com.tab;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;
    import java.util.ArrayList;
    import java.util.List;
    /**
    * Created by JesseHev
    */
    public class BasePageAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragments = new ArrayList<>();
    private final List<String> mFragmentTitles = new ArrayList<>();
    public BasePageAdapter(FragmentManager fm) {
    super(fm);
    }
    @Override public Fragment getItem(int position) {
    return mFragments.get(position);
    }
    public void addFrag(Fragment fragment, String title) {
    mFragments.add(fragment);
    mFragmentTitles.add(title);
    }
    public void update(List<Fragment> fragments) {
    if (fragments != null && fragments.size() > 0) {
    mFragments.clear();
    mFragments.addAll(fragments);
    notifyDataSetChanged();
    }
    }
    @Override public int getCount() {
    return mFragments.size();
    }
    }

至此功能已经实现!下面列出一些TabLayout常用的属性和方法

TabLayout的相关属性:

更改xml属性的时候,需要在相应的xml文件中的根布局中添加名称空间
xmlns:app="http://schemas.android.com/apk/res-auto"
以下属性都是在TabLayout布局中添加

  1. 更改选中tab的字体颜色
    app:tabSelectedTextColor="@color/red"
  2. 更改未选中tab的字体颜色
    app:tabTextColor="@color/colorPrimary"
  3. 更改指示器下标的颜色
    app:tabIndicatorColor="@color/@color/red"
  4. 更改整个TabLayout的背景颜色
    app:tabBackground="@color/red"
  5. 更改字体样式(大小),没有直接的size属性更改字体大小,需要使用到app:tabTextAppearance来间接改变字体
    app:tabTextAppearance="@android:style/TextAppearance.Holo.Large"
    @style 后面有三种值可引入分别是大、中、小:

    1
    2
    3
    4
    5
    <style name="TextAppearance.Holo.Large" parent="TextAppearance.Large" />
    <style name="TextAppearance.Holo.Medium" parent="TextAppearance.Medium" />
    <style name="TextAppearance.Holo.Small" parent="TextAppearance.Small" />
  6. 改变指示器高度
    app:tabIndicatorHeight="5dp"

  7. 给tab的item设置图标
    mTab.addTab(mTab.newTab().setText("Tab 1").setIcon(R.mipmap.ic_launcher));

写在结尾

如果不想在addTab的时候去设置icon还可以用另一种方式:
mTab.getTabAt(position).setIcon(R.mipmap.ic_launcher);
position 为item在tab中的下标位置。在item被选中的时候动态改变item图标。

注:上面代码中是以代码的方式生成tab项,还有一种以xml的方式生成tab项目如下:

1
2
3
4
5
6
7
8
9
10
11
12
<android.support.design.widget.TabLayout
android:id="@+id/tab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<android.support.design.widget.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:icon="@mipmap/ic_launcher"
android:text="我是item"
/>
</android.support.design.widget.TabLayout>

示例只添加了一个tab,当然你可以自由添加多个tab。
文中的代码可以自己拷贝使用!

本文结束,谢谢你的阅读!