TabLayout是android.support.design里的一个控件,使用它可以很方便的做出顶部导航和底部导航。类似于这样的,能设置选中时字体的颜色和选中时的图片。

效果如图:

首先我们在 build.gradle中引入


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

布局文件如下:

<?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.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight=""
android:id="@+id/three_viewpager"></android.support.v4.view.ViewPager>
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/three_tablayout"
app:tabBackground="@drawable/selector_bg"
style="@style/MyCustomTabLayout"></android.support.design.widget.TabLayout> </LinearLayout>

style里面设置了一些属性如下:

   <!--样式-->
<style name="MyCustomTabLayout" parent="Widget.Design.TabLayout">
<item name="tabIndicatorColor">?attr/colorAccent</item>
<item name="tabIndicatorHeight">0dp</item>
<item name="tabPaddingStart">12dp</item>
<item name="tabTextColor">#aaa</item>
<item name="tabPaddingEnd">12dp</item>
<item name="tabSelectedTextColor">#f00</item>
</style>

abIndicatorHeight是设置导航那个指示器高度为0,因为不需要那个指示器了。

然后app:tabBackground 就是如果你需要给单项选中时设置个背景,那就用app:tabBackground,

也写一个颜色的selector就行了。不需要改变背景的话就不用设置这个属性了。

selector_bg.xml 如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/lightgray" android:state_selected="true"></item>
<item android:drawable="@color/gray" ></item>
</selector>

colors.xml中添加颜色

<color name="lightgray">#FFEEEEEE</color>
<color name="gray">#FFDDDDDD</color>

代码如下:

import android.graphics.drawable.Drawable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; import java.util.ArrayList;
import java.util.List; public class ThreeActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_three);
ViewPager viewPager = (ViewPager) findViewById(R.id.three_viewpager);
TabLayout three_tablayout = (TabLayout) findViewById(R.id.three_tablayout); List<Fragment> fragments = new ArrayList<>();
fragments.add(new ThreeFragment());
fragments.add(new ThreeFragment());
fragments.add(new ThreeFragment());
fragments.add(new ThreeFragment()); String [] titles = new String [] {"首页","流量","社区","关于"}; //设置适配器
TitleFragmentPagerAdapter adapter = new TitleFragmentPagerAdapter(getSupportFragmentManager(),fragments,titles);
viewPager.setAdapter(adapter);
//绑定
three_tablayout.setupWithViewPager(viewPager); for(int i = 0; i < three_tablayout.getTabCount(); i++){
TabLayout.Tab tab = three_tablayout.getTabAt(i);
Drawable d = null;
switch (i){
case 0:
d = getResources().getDrawable(R.drawable.tab_menu_deal_home);
break;
case 1:
d = getResources().getDrawable(R.drawable.tab_menu_deal_classify);
break;
case 2:
d = getResources().getDrawable(R.drawable.tab_menu_deal_community);
break;
case 3:
d = getResources().getDrawable(R.drawable.tab_menu_deal_user);
break;
}
tab.setIcon(d);
} }
}

适配器如下:

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import java.util.List; public class TitleFragmentPagerAdapter extends FragmentPagerAdapter { private List<Fragment> mFragmentList;
private String [] titles; public TitleFragmentPagerAdapter(FragmentManager fm, List<Fragment> mFragmentList) {
super(fm);
this.mFragmentList = mFragmentList;
} /**
* titles是给TabLayout设置title用的
* @param fm
* @param mFragmentList
* @param titles
*/
public TitleFragmentPagerAdapter(FragmentManager fm, List<Fragment> mFragmentList, String[] titles) {
super(fm);
this.mFragmentList = mFragmentList;
this.titles = titles;
} /**
* 描述:获取索引位置的Fragment.
* @param position
* @return
*/
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
if (position < mFragmentList.size()){
fragment = mFragmentList.get(position); }else{
fragment = mFragmentList.get(0); }
return fragment;
} /**
* 返回viewpager对应的title。
* @param position
* @return
*/
@Override
public CharSequence getPageTitle(int position) {
if (titles != null && titles.length>0){
return titles[position];
}
return null;
} /**
* 描述:获取数量.
* @return
*/
@Override
public int getCount() {
return mFragmentList.size();
}
}
R.drawable.tab_menu_deal_home如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/bottom_tab_home_selected" android:state_selected="true"></item>
<item android:drawable="@drawable/bottom_tab_home_normal"></item>
</selector>

其它三个类似。

完成

 
 

TabLayout实现底部导航栏(2)的更多相关文章

  1. Android底部导航栏(可滑动)----TabLayout+viewPager

    [TabLayout] ①TabLayout是选项卡,在屏幕空间有限的情况下,对不同的空间进行分组.属于android support design,更多的用于新闻上,如果放在底部也可做底部导航栏 ② ...

  2. TextView+Fragment实现底部导航栏

    前言:项目第二版刚上线没多久,产品又对需求进行了大改动,以前用的是左滑菜单,现在又要换成底部导航栏,于是今天又苦逼加班了.花了几个小时实现了一个底部导航栏的demo,然后总结一下.写一篇博客.供自己以 ...

  3. Android应用底部导航栏(选项卡)实例

    现在很多android的应用都采用底部导航栏的功能,这样可以使得用户在使用过程中随意切换不同的页面,现在我采用TabHost组件来自定义一个底部的导航栏的功能. 我们先看下该demo实例的框架图: 其 ...

  4. Android 修改底部导航栏navigationbar的颜色

    Android 修改底部导航栏navigationbar的颜色 getWindow().setNavigationBarColor(Color.BLUE); //写法一 getWindow().set ...

  5. Android底部导航栏——FrameLayout + RadioGroup

    原创文章,转载请注明出处http://www.cnblogs.com/baipengzhan/p/6285881.html Android底部导航栏有多种实现方式,本文详细介绍FrameLayout ...

  6. Android底部导航栏创建——ViewPager + RadioGroup

    原创文章,引用请注明出处:http://www.cnblogs.com/baipengzhan/p/6270201.html Android底部导航栏有多种实现方式,本文详解其中的ViewPager ...

  7. 二、Fragment+RadioButton实现底部导航栏

    在App中经常看到这样的tab底部导航栏   那么这种效果是如何实现,实现的方式有很多种,最常见的就是使用Fragment+RadioButton去实现.下面我们来写一个例子 首先我们先在activi ...

  8. Android学习笔记- Fragment实例 底部导航栏的实现

    1.要实现的效果图以及工程目录结构: 先看看效果图吧: 接着看看我们的工程的目录结构: 2.实现流程: Step 1:写下底部选项的一些资源文件 我们从图上可以看到,我们底部的每一项点击的时候都有不同 ...

  9. [置顶] xamarin android Fragment实现底部导航栏

    前段时间写了篇关于Fragment的文章,介绍了基础的概念,用静态和动态的方式加载Fragment  Xamarin Android Fragment的两种加载方式.下面的这个例子介绍xamarin ...

随机推荐

  1. Java 5新特性 for each 和Iterator的选择

    在使用一边做迭代操作一边做删除数组元素操作是应该使用Iterator package for_each_And_Iterator; public class Commodity { private S ...

  2. 编写高质量代码改善C#程序的157个建议——建议24:迭代器应该是只读的

    建议24:迭代器应该是只读的 如果注意观察会发现,FCL中的迭代器只有GetEnumerator方法,没有SetEnumerator方法,所有的集合类也没有一个可以写的迭代器属性.原因有二: 一:这违 ...

  3. 请教一个Jquery ligerui 框架的小问题

    关闭子窗体时,要刷新父窗体,百度了很多像使用“window.opener.location.reload();”都不行,和easyui框架是有区别的 在子窗体里写Response.Write(&quo ...

  4. 正则表达式回溯-导致CPU偏高

    最近了解了下有关正则表达式回溯的内容,想想就写下来,方便自己. 正则表达式匹配算法是建立在正则表达式引擎的基础上的,目前有两种引擎:DFA(确定型有穷自动机)和NFA(不确定型有穷自动机).这两种引擎 ...

  5. C#多线程编程实战1.2暂停线程(休眠)

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  6. web3部署智能合约碰到的一个奇怪问题

    都是gasLimit惹的祸 解决一个奇怪问题Error: Number can only safely store up to 53 bits 原来好好的node endpointtest.js ,结 ...

  7. go与c互相调用

    此例子来自于go源码中,借此来和大家分享一下两者如何调用,网上很多文章语言不详,也没有一个完整的测试例子 目录结构 首先src 目录下有 testcgowin目录下: 这里的_obj目录是cgo生成的 ...

  8. 「HNOI2008」越狱

    题目链接 戳我 \(Solution\) 正难则反,这道题直接做有点困难,但我们可以反过来思考我们可以用总方案数减去不可以越狱的方案数 首先来算总方案数: 对于每个房间的人都有\(M\)种宗教可以选, ...

  9. 解决git一直输入用户名和密码的问题

    git config --system --unset credential.helper,在git中输入此命令后,每次拉去代码需要重新输入用户名和密码,可以使用git config --global ...

  10. selenium面试题

    selenium中如何判断元素是否存在? selenium中没有提供原生的方法判断元素是否存在,一般我们可以通过定位元素+异常捕获的方式判断. # 判断元素是否存在 try: dr.find_elem ...