类似“网易新闻”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. 【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(二)

    Log4j 这个东西,大家都熟悉,就简单的介绍一下,算是一个抛砖引玉,因为我自己在Log日志的搭建方面,没有什么经验,但这东西确实是非常重要的,日后调Bug没有它基本不可能,如果有朋友有什么比较好的L ...

  2. 初学Vue2.0--基础篇

    概述: 鉴于本人初学,使用的编译器是webStorm,需添加对VUE的支持,添加方法可以参考 http://www.jianshu.com/p/142dae4f8b51. 起步: 1. 扎实的 Jav ...

  3. ParamTest

    package fourth; public class ParamTest { public static void main(String[] args) { // TODO Auto-gener ...

  4. php登录主机机制

    注册机制 //用户名需过滤的字符的正则 $stripChar = '?<*.>\'"'; ){ $this->error('用户名中包含'.$stripChar.'等非法字 ...

  5. 转载:MySQL 语句大全:创建、授权、查询、修改等

    本文转载>这里 一.用户创建.权限.删除 1.连接MySql操作 连接:mysql -h 主机地址 -u 用户名 -p 用户密码 (注:u与root可以不用加空格,其它也一样)断开:exit ( ...

  6. UnityEditor

    1.添加菜单 [MenuItem("Tools/MyTool")] [MenuItem("Tools/MyTool", false, 10)] 优先级控制菜单的 ...

  7. CentOS 6 部署GlusterFS

    首先需要关闭CentOS的防火墙和selinux,否则glusterfs将可能无法正常工作. /etc/init.d/iptables status 会得到一系列信息,说明防火墙开着. /etc/in ...

  8. Mysql基础(一)

    Mysql的历史度娘上一堆,就不再介绍了. 本文依照此路径学习Mysql数据库:数据库->表->数据 首先启动Mysql服务,然后通过控制台命令登入root账户输入密码回车 C:\User ...

  9. AVAudioPlayer

    AVAudioPlayer在AVFoundation框架下,所以我们要导入AVFoundation.framework. AVAudioPlayer类封装了播放单个声音的能力.播放器可以用NSURL或 ...

  10. 利用Levenshtein Distance (编辑距离)实现文档相似度计算

    1.首先将word文档解压缩为zip /** * 修改后缀名 */ public static String reName(String path){ File file=new File(path) ...