类似“网易新闻”UI设计就很好,顶部是导航,下面是各个页面。如图

这种效果使用design包中的TabLayout可以轻松的实现。
 

一、分析TabLayout 常见 UI

上图效果可以用如下代码实现:
         //设置背景色
mTabLayout.setBackgroundColor(Color.LTGRAY);
//设置填满TabLayout,或者居中
mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
//设置tabLayout是可以滑动的,或者固定大小
mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
//设置选中的Tab指示器为蓝色
mTabLayout.setSelectedTabIndicatorColor(Color.RED);
//设置正常字体颜色和被选中字体颜色
mTabLayout.setTabTextColors(Color.WHITE,Color.RED);
//添加Tab条目
mTabLayout.addTab(mTabLayout.newTab().setText("头条"));
mTabLayout.addTab(mTabLayout.newTab().setText("热点"));
mTabLayout.addTab(mTabLayout.newTab().setText("娱乐"));
mTabLayout.addTab(mTabLayout.newTab().setText("体育"));
mTabLayout.addTab(mTabLayout.newTab().setText("奥运"));

二、分析Tab

Tab中的set方法都会返回Tab本身,也就是说这是链式调用。修改代码效果,如下所示:
代码如下所示:
         //设置背景色
mTabLayout.setBackgroundColor(Color.LTGRAY);
//设置填满TabLayout,或者居中
mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
//设置tabLayout是可以滑动的,或者固定大小
mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
//设置选中的Tab指示器为蓝色
mTabLayout.setSelectedTabIndicatorColor(Color.RED);
//设置正常字体颜色和被选中字体颜色
mTabLayout.setTabTextColors(Color.WHITE,Color.RED);
//添加Tab条目
//添加图标
mTabLayout.addTab(mTabLayout.newTab().setText("头条").setIcon(R.drawable.th_languages));
//添加自定义View作为Tab
ImageView redian = new ImageView(this);
redian.setImageResource(R.drawable.th_lastfm);
mTabLayout.addTab(mTabLayout.newTab().setText("热点").setCustomView(redian));
ImageView yule = new ImageView(this);
yule.setImageResource(R.drawable.th_lexitron);
mTabLayout.addTab(mTabLayout.newTab().setCustomView(yule));
mTabLayout.addTab(mTabLayout.newTab().setText("体育"));
mTabLayout.addTab(mTabLayout.newTab().setText("奥运"));

三、TabLayout的回调

 mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
//选中的Tab
Log.d("MainActivity", "onTabSelected position:" + tab.getPosition() + "\t text:" + tab.getText());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
//取消选中的Tab,即上一个选中的Tab
Log.d("MainActivity", "onTabUnselected position:" + tab.getPosition() + "\t text:" + tab.getText());
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
//再次选择某个选项卡,即选择当前选中的Tab会调用;而不是选中之前选过的Tab
Log.d("MainActivity", "onTabReselected position:" + tab.getPosition() + "\t text:" + tab.getText());
}
});

注意:1-当前是“头条”,重复点击会调用onTabReselected回调。
          2-点击“热点”,所以上一个是“头条”,当前是“热点”。
          3-再点击“头条”,不会调用onTabReselected回调。

四、和Viewpager结合使用

TabLayout中提供了一个Viewpager页面切换的监听器,如下源码。
 /**
* A {@link ViewPager.OnPageChangeListener} class which contains the
* necessary calls back to the provided {@link TabLayout} so that the tab position is
* kept in sync.
*
* <p>This class stores the provided TabLayout weakly, meaning that you can use
* {@link ViewPager#addOnPageChangeListener(ViewPager.OnPageChangeListener)
* addOnPageChangeListener(OnPageChangeListener)} without removing the listener and
* not cause a leak.
*/
public static class TabLayoutOnPageChangeListener implements ViewPager.OnPageChangeListener {
private final WeakReference<TabLayout> mTabLayoutRef;
private int mPreviousScrollState;
private int mScrollState;
public TabLayoutOnPageChangeListener(TabLayout tabLayout) {
mTabLayoutRef = new WeakReference<>(tabLayout);
}
@Override
public void onPageScrollStateChanged(int state) {
mPreviousScrollState = mScrollState;
mScrollState = state;
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
final TabLayout tabLayout = mTabLayoutRef.get();
if (tabLayout != null) {
// Only update the text selection if we're not settling, or we are settling after
// being dragged
final boolean updateText = mScrollState != SCROLL_STATE_SETTLING ||
mPreviousScrollState == SCROLL_STATE_DRAGGING;
// Update the indicator if we're not settling after being idle. This is caused
// from a setCurrentItem() call and will be handled by an animation from
// onPageSelected() instead.
final boolean updateIndicator = !(mScrollState == SCROLL_STATE_SETTLING
&& mPreviousScrollState == SCROLL_STATE_IDLE);
tabLayout.setScrollPosition(position, positionOffset, updateText, updateIndicator);
}
}
@Override
public void onPageSelected(int position) {
final TabLayout tabLayout = mTabLayoutRef.get();
if (tabLayout != null && tabLayout.getSelectedTabPosition() != position) {
// Select the tab, only updating the indicator if we're not being dragged/settled
// (since onPageScrolled will handle that).
final boolean updateIndicator = mScrollState == SCROLL_STATE_IDLE
|| (mScrollState == SCROLL_STATE_SETTLING
&& mPreviousScrollState == SCROLL_STATE_IDLE);
tabLayout.selectTab(tabLayout.getTabAt(position), updateIndicator);
}
}
private void reset() {
mPreviousScrollState = mScrollState = SCROLL_STATE_IDLE;
}
}
所以,在使用过程中很简单:
 tabLayout.addTab(tabLayout.newTab().setText("全部订单"));
tabLayout.addTab(tabLayout.newTab().setText("待发货"));
tabLayout.addTab(tabLayout.newTab().setText("配送/自提"));
tabLayout.addTab(tabLayout.newTab().setText("配送/自提"));
tabLayout.addTab(tabLayout.newTab().setText("已完成"));
PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(adapter);
//使用TabLayout提供的监听
mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
//设置ViewPager联动
mViewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
});
}
 
 

design包 TabLayout使用的更多相关文章

  1. 安卓Design包之TabLayout控件的简单使用

    Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个supp ...

  2. 安卓Design包之TabLayout控件的使用

    转自: 安卓Design包之TabLayout控件的简单使用 Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android ...

  3. 带你实现开发者头条APP(四)---首页优化(加入design包)

    title: 带你实现开发者头条APP(四)---首页优化(加入design包) tags: design,Toolbar,TabLayout,RecyclerView grammar_cjkRuby ...

  4. 使用Design包实现QQ动画侧滑效果和滑动菜单导航

    Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个supp ...

  5. 安卓Design包之超强控件CoordinatorLayout与SnackBar的简单使用

    在前面的Design中,学习使用了TabLayout,NavigationView与DrawerLayout实现的神奇效果,今天就带来本次Design包中我认为最有意义的控件CoordinatorLa ...

  6. 安卓官方ViewPager与android.support.design.widget.TabLayout双向交互联动切换 。

    该TabLayout的功用,简单的说,就是当用户在该TabLayout的选项卡子item中选择触摸时候,文字和下方的指示器横条滑动指示.android.support.design.widget.Ta ...

  7. 安卓Design包之CollapsingToolbarLayout(可折叠的工具栏布局)的简单使用

    转自: CollapsingToolbarLayout的使用 注意:使用前需要添加Design依赖包,使用toolbar时需要隐藏标题头 CollapsingToolbarLayout作用是提供了一个 ...

  8. 安卓Design包之CoordinatorLayout配合AppBarLayout,ToolBar,TabLaout的使用

    转载: CoordinatorLayout配合AppBarLayout,Toolbar和TabLayout的使用 控件的简单介绍: AppBarLayout:它是继承LinerLayout实现的一个V ...

  9. Android Material Design:滑动指示选项卡android.support.design.widget.TabLayout的简单使用

    该TabLayout的功用,简单的说,就是当用户在该TabLayout的选项卡子item中选择触摸时候,文字和下方的指示器横条滑动指示.这个功能就是以前APP开发常用的选项卡某一卡片被切换.选中时候的 ...

随机推荐

  1. broadcasting Theano vs. Numpy

    broadcasting Theano vs. Numpy broadcast mechanism allows a scalar may be added to a matrix, a vector ...

  2. CSS3 border-image 属性

    border-image 属性是一个简写属性,用于设置以下属性: border-image-source 用在边框的图片的路径,默认值none. 如:border-image-source:url(b ...

  3. Z字形扫描(201412-2)

    问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n×n的矩阵,Z字形扫描的过程如下图所示: 对于下面的4×4的矩阵, 1 5 3 9 3 7 5 ...

  4. [慢查优化]建索引时注意字段选择性 & 范围查询注意组合索引的字段顺序

    文章转自:http://www.cnblogs.com/zhengyun_ustc/p/slowquery2.html 写在前面的话: 之前曾说过"不要求每个人一定理解 联表查询(join/ ...

  5. 【Java之对象清理】finalize()的用途

    Java允许在类中定义一个名为finalize()的方法.它的工作原理是:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法.并且在下一次垃圾回收动作发生时,才会真正回收 ...

  6. c语言经典算法——查找一个整数数组中第二大数

    题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大数和第二大数,然后将数组剩余的数依次与这两个数比较,如果这个数a比max1大,则先将max1 ...

  7. 【bzoj1688】[USACO2005 Open]Disease Manangement 疾病管理

    题目描述 Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is running through the farm. Far ...

  8. PXE+Kickstart+DHCP+TFTP实现无人值守安装操作系统

    PXE+Kickstart+DHCP+TFTP实现无人值守安装操作系统 PXE + Kickstart PXE的工作流程及配置文件 Kickstart的配置文件 Linux安装大致可以分为2个阶段 第 ...

  9. Tomcat使用详解

    Tomcat简介 官网:http://tomcat.apache.org/ Tomcat GitHub 地址:https://github.com/apache/tomcat Tomcat是Apach ...

  10. nginx配置反向代理解决前后端分离跨域问题

    摘自<AngularJS深度剖析与最佳实践>P132 nginx配置文件如下: server { listen ; server_name your.domain.name; locati ...