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控件
<?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
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中添加相应代码
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的适配器,代码如下
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 后面有三种值可引入分别是大、中、小:

<style name="TextAppearance.Holo.Large" parent="TextAppearance.Large" />

<style name="TextAppearance.Holo.Medium" parent="TextAppearance.Medium" />

<style name="TextAppearance.Holo.Small" parent="TextAppearance.Small" />
  1. 改变指示器高度
    app:tabIndicatorHeight="5dp"
  2. 给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项目如下:

 <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。
文中的代码可以直接拷贝使用!

本文结束,谢谢你的阅读!
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值