design包 TabLayout使用

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

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

一、分析TabLayout 常见 UI

上图效果可以用如下代码实现:

 1         //设置背景色
 2         mTabLayout.setBackgroundColor(Color.LTGRAY);
 3         //设置填满TabLayout,或者居中
 4         mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
 5         //设置tabLayout是可以滑动的,或者固定大小
 6         mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
 7         //设置选中的Tab指示器为蓝色
 8         mTabLayout.setSelectedTabIndicatorColor(Color.RED);
 9         //设置正常字体颜色和被选中字体颜色
10         mTabLayout.setTabTextColors(Color.WHITE,Color.RED);
11         //添加Tab条目
12         mTabLayout.addTab(mTabLayout.newTab().setText("头条"));
13         mTabLayout.addTab(mTabLayout.newTab().setText("热点"));
14         mTabLayout.addTab(mTabLayout.newTab().setText("娱乐"));
15         mTabLayout.addTab(mTabLayout.newTab().setText("体育"));
16         mTabLayout.addTab(mTabLayout.newTab().setText("奥运"));

二、分析Tab

Tab中的set方法都会返回Tab本身,也就是说这是链式调用。修改代码效果,如下所示:

代码如下所示:

 1         //设置背景色
 2         mTabLayout.setBackgroundColor(Color.LTGRAY);
 3         //设置填满TabLayout,或者居中
 4         mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
 5         //设置tabLayout是可以滑动的,或者固定大小
 6         mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
 7         //设置选中的Tab指示器为蓝色
 8         mTabLayout.setSelectedTabIndicatorColor(Color.RED);
 9         //设置正常字体颜色和被选中字体颜色
10         mTabLayout.setTabTextColors(Color.WHITE,Color.RED);
11         //添加Tab条目
12         //添加图标
13         mTabLayout.addTab(mTabLayout.newTab().setText("头条").setIcon(R.drawable.th_languages));
14         //添加自定义View作为Tab
15         ImageView redian = new ImageView(this);
16         redian.setImageResource(R.drawable.th_lastfm);
17         mTabLayout.addTab(mTabLayout.newTab().setText("热点").setCustomView(redian));
18         ImageView yule = new ImageView(this);
19         yule.setImageResource(R.drawable.th_lexitron);
20         mTabLayout.addTab(mTabLayout.newTab().setCustomView(yule));
21         mTabLayout.addTab(mTabLayout.newTab().setText("体育"));
22         mTabLayout.addTab(mTabLayout.newTab().setText("奥运"));

三、TabLayout的回调

 1 mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
 2             @Override
 3             public void onTabSelected(TabLayout.Tab tab) {
 4                 //选中的Tab
 5                 Log.d("MainActivity", "onTabSelected position:" + tab.getPosition() + "\t text:" + tab.getText());
 6             }
 7             @Override
 8             public void onTabUnselected(TabLayout.Tab tab) {
 9                 //取消选中的Tab,即上一个选中的Tab
10                 Log.d("MainActivity", "onTabUnselected position:" + tab.getPosition() + "\t text:" + tab.getText());
11             }
12             @Override
13             public void onTabReselected(TabLayout.Tab tab) {
14                 //再次选择某个选项卡,即选择当前选中的Tab会调用;而不是选中之前选过的Tab
15                 Log.d("MainActivity", "onTabReselected position:" + tab.getPosition() + "\t text:" + tab.getText());
16             }
17         });

注意:1-当前是“头条”,重复点击会调用onTabReselected回调。

2-点击“热点”,所以上一个是“头条”,当前是“热点”。

3-再点击“头条”,不会调用onTabReselected回调。

四、和Viewpager结合使用

TabLayout中提供了一个Viewpager页面切换的监听器,如下源码。

 1 /**
 2      * A {@link ViewPager.OnPageChangeListener} class which contains the
 3      * necessary calls back to the provided {@link TabLayout} so that the tab position is
 4      * kept in sync.
 5      *
 6      * <p>This class stores the provided TabLayout weakly, meaning that you can use
 7      * {@link ViewPager#addOnPageChangeListener(ViewPager.OnPageChangeListener)
 8      * addOnPageChangeListener(OnPageChangeListener)} without removing the listener and
 9      * not cause a leak.
10      */
11     public static class TabLayoutOnPageChangeListener implements ViewPager.OnPageChangeListener {
12         private final WeakReference<TabLayout> mTabLayoutRef;
13         private int mPreviousScrollState;
14         private int mScrollState;
15         public TabLayoutOnPageChangeListener(TabLayout tabLayout) {
16             mTabLayoutRef = new WeakReference<>(tabLayout);
17         }
18         @Override
19         public void onPageScrollStateChanged(int state) {
20             mPreviousScrollState = mScrollState;
21             mScrollState = state;
22         }
23         @Override
24         public void onPageScrolled(int position, float positionOffset,
25                 int positionOffsetPixels) {
26             final TabLayout tabLayout = mTabLayoutRef.get();
27             if (tabLayout != null) {
28                 // Only update the text selection if we‘re not settling, or we are settling after
29                 // being dragged
30                 final boolean updateText = mScrollState != SCROLL_STATE_SETTLING ||
31                         mPreviousScrollState == SCROLL_STATE_DRAGGING;
32                 // Update the indicator if we‘re not settling after being idle. This is caused
33                 // from a setCurrentItem() call and will be handled by an animation from
34                 // onPageSelected() instead.
35                 final boolean updateIndicator = !(mScrollState == SCROLL_STATE_SETTLING
36                         && mPreviousScrollState == SCROLL_STATE_IDLE);
37                 tabLayout.setScrollPosition(position, positionOffset, updateText, updateIndicator);
38             }
39         }
40         @Override
41         public void onPageSelected(int position) {
42             final TabLayout tabLayout = mTabLayoutRef.get();
43             if (tabLayout != null && tabLayout.getSelectedTabPosition() != position) {
44                 // Select the tab, only updating the indicator if we‘re not being dragged/settled
45                 // (since onPageScrolled will handle that).
46                 final boolean updateIndicator = mScrollState == SCROLL_STATE_IDLE
47                         || (mScrollState == SCROLL_STATE_SETTLING
48                         && mPreviousScrollState == SCROLL_STATE_IDLE);
49                 tabLayout.selectTab(tabLayout.getTabAt(position), updateIndicator);
50             }
51         }
52         private void reset() {
53             mPreviousScrollState = mScrollState = SCROLL_STATE_IDLE;
54         }
55     }

所以,在使用过程中很简单:

 1 tabLayout.addTab(tabLayout.newTab().setText("全部订单"));
 2         tabLayout.addTab(tabLayout.newTab().setText("待发货"));
 3         tabLayout.addTab(tabLayout.newTab().setText("配送/自提"));
 4         tabLayout.addTab(tabLayout.newTab().setText("配送/自提"));
 5         tabLayout.addTab(tabLayout.newTab().setText("已完成"));
 6         PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager());
 7         mViewPager.setAdapter(adapter);
 8         //使用TabLayout提供的监听
 9         mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
10         tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
11             @Override
12             public void onTabSelected(TabLayout.Tab tab) {
13                 //设置ViewPager联动
14                 mViewPager.setCurrentItem(tab.getPosition());
15             }
16             @Override
17             public void onTabReselected(TabLayout.Tab tab) {
18             }
19             @Override
20             public void onTabUnselected(TabLayout.Tab tab) {
21             }
22         });
23     }

null

时间: 2024-10-06 00:45:09

design包 TabLayout使用的相关文章

安卓Design包之TabLayout控件的使用

转自: 安卓Design包之TabLayout控件的简单使用 Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个support库里面,Google给我们提供了更加规范的MD设计风格的控件.最重要的是,Android Design Support Library的兼容性更广,直接可以向下兼容到Android 2.2.这不得不说是一个良心之作. 使用方法很简单

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

Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个support库里面,Google给我们提供了更加规范的MD设计风格的控件.最重要的是,Android Design Support Library的兼容性更广,直接可以向下兼容到Android 2.2.这不得不说是一个良心之作. 使用方法很简单,只需要添加一句依赖 compile 'com.android

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

在前面的Design中,学习使用了TabLayout,NavigationView与DrawerLayout实现的神奇效果,今天就带来本次Design包中我认为最有意义的控件CoordinatorLayout. 当然还有SnackBar,不过他在实际运用中一般都是和CoordinatorLayout搭配使用的. 先说下SnackBar,这个控件其实我觉得和Toast没什么差别,不过功能上的确有增强.这个控件可以通过setAction方法设置类似按钮一样的东西.而且这个东西可以设置多个. 重点还是

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

转自: CollapsingToolbarLayout的使用 注意:使用前需要添加Design依赖包,使用toolbar时需要隐藏标题头 CollapsingToolbarLayout作用是提供了一个可以折叠的Toolbar,它继承至FrameLayout,给它设置layout_scrollFlags,它可以控制包含在CollapsingToolbarLayout中的控件(如:ImageView.Toolbar)在响应layout_behavior事件时作出相应的scrollFlags滚动事件(

Android学习笔记--design包下的两个控件

今天学习了design包下的两个控件,记录一下,首先需要我们依赖 1 compile 'com.android.support:design:25.0.0' 之后在XML文件中就可以使用了 1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 x

安卓Design包之AppBar和Toolbar的联用

前面讲了Design包的的CoordinatorLayout和SnackBar的混用,现在继续理解Design包的AppBar; AppBarLayout跟它的名字一样,把容器类的组件全部作为AppBar. 如: <android.support.design.widget.AppBarLayout android:layout_width="match_parent" app:theme="@style/Base.ThemeOverlay.AppCompat.Dark

Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class android.support.design.widget.TabLayout,TableLayout引起页面崩溃

在使用TableLayout的时候,运行引用程序直接Crash. FATAL EXCEPTION: main Process: com.edaixi.activity, PID: 9703 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.edaixi.activity/com.edaixi.activity.PriceCenterActivity}: android.view.InflateExcept

安卓Design包下的TextInputLayout和FloatingActionButton的简单使用

终于介绍到Design包的最后的东西了. 也很简单,一个是TextInputLayout. TextInputLayout作为一个父容器,包含一个新的EditText,可以给EditText添加意想不到的效果,特别在注册功能开发中,用处非常广泛. 它可以直接提示输入错误,而不至于像以前一样总是点击按钮后才能检测出输入的错误,当有很多输出框的时候更是难以区分.. 并且还可以把hint 默认提示值放到上面去. 实现界面大概是这样的. 当你输入正确后是这样的. 实现代码也很简单. 添加一个监听焦点事件

ViewPager与android.support.design.widget.TabLayout双向交互联动切换

通常,android.support.design.widget.TabLayout与Android的ViewPager联合使用,实现与ViewPager的切换与联动.(1)比如,当用户手指触摸选择TabLayout中的某一项时候,ViewPager应当自动切换跳转到相应的Page页面:(2)同样,当用户在翻动ViewPager时候,TabLayout也会自动的滚动到与当前ViewPager页面像对应的子item tab并使该子item tab处于选中状态. 测试用的主Activity Main