我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android控件-TabLayout使用介绍

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android控件-TabLayout使用介绍

TabLayout简述简单示例TabLayout属性介绍tabIndicatorFullWidthtabRippleColortabTextAppearancetabModetabIndicatorColortabIndicatorHeighttabIndicatorGravity给TabLayout设置间隔drawable 简述

TabLayout是Android support中的一个控件android.support.design.widget.TabLayout,Google在升级了AndroidX之后,将TabLayout迁移到material包下面去了com.google.android.material.tabs.TabLayout,原来的support下面的TabLayout从API 29开始就不再维护了。所以如果项目已经升级了AndroidX,建议直接使用后者。TabLayout一般结合ViewPager+Fragment的使用实现滑动的标签选择器。
比如新闻标签切换

ConstraintLayout 布局里面就一个TabLayout和一个ViewPager,tabSelectedTextColor和tabTextColor属性分别设置标签选中和未选中状态的文字颜色,其他属性后面介绍。
TabFragment.java

public class TabFragment extends Fragment {
    public static TabFragment newInstance(String label) {
        Bundle args = new Bundle();
        args.putString("label", label);
        TabFragment fragment = new TabFragment();
        fragment.setArguments(args);
        return fragment;
    }
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_tab, container, false);
    }
    @Override
    public void onStart() {
        super.onStart();
        String label = getArguments().getString("label");
        TextView text = getView().findViewById(R.id.tv_bg);
        text.setText(label);
        text.setBackgroundColor(Color.rgb((int)(Math.random() * 255), (int)(Math.random() * 255), (int)(Math.random() * 255)));
    }
}

TabFragment中就一个TextView,每一个fragment设置不同的label和背景颜色。

TabActivity.java

public class TabActivity extends AppCompatActivity {
    private String[] tabs = {"tab1", "tab2", "tab3"};
    private List tabFragmentList = new ArrayList();
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tab);
        TabLayout tabLayout = findViewById(R.id.tab_layout);
        ViewPager viewPager = findViewById(R.id.view_pager);
        //添加tab
        for (int i = 0; i < tabs.length; i++) {
            tabLayout.addTab(tabLayout.newTab().setText(tabs[i]));
            tabFragmentList.add(TabFragment.newInstance(tabs[i]));
        }
        viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager(), FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
            @NonNull
            @Override
            public Fragment getItem(int position) {
                return tabFragmentList.get(position);
            }
            @Override
            public int getCount() {
                return tabFragmentList.size();
            }
            @Nullable
            @Override
            public CharSequence getPageTitle(int position) {
                return tabs[position];
            }
        });
        //设置TabLayout和ViewPager联动
        tabLayout.setupWithViewPager(viewPager,false);
    }
}

简单的3步:

为TabLayout添加tab 给ViewPager设置adapter 设置TabLayout和ViewPager联动

看看运行结果:
在这里插入图片描述
好了,基本的功能已经实现了。这里有个需要注意的点:
就是在给ViewPager设置Adapter的时候,一定要重写getPageTitle(int position)方法,不然TabLayout中的标签是看不到的,即使在addTab时newTab().setText(tabs[i])也没用。原因很简单,是在tabLayout.setupWithViewPager的时候,TabLayout中先将所有tabs remove了,然后取的PagerAdapter中的getPageTitle返回值添加的tab。看下源码

@ViewPager.DecorView
public class TabLayout extends HorizontalScrollView {
	...
	private void setupWithViewPager(
	      @Nullable final ViewPager viewPager, boolean autoRefresh, boolean implicitSetup) {
		if (viewPager != null) {
			this.viewPager = viewPager;
			...
			final PagerAdapter adapter = viewPager.getAdapter();
	      	if (adapter != null) {
	        	// Now we'll populate ourselves from the pager adapter, adding an observer 	if
	        	// autoRefresh is enabled
	        	setPagerAdapter(adapter, autoRefresh);
	      	}
	      	...
	    } else {
	      // We've been given a null ViewPager so we need to clear out the internal state,
	      // listeners and observers
	      this.viewPager = null;
	      setPagerAdapter(null, false);
	    }
	}
	void setPagerAdapter(@Nullable final PagerAdapter adapter, final boolean addObserver) {
		...
	    // Finally make sure we reflect the new adapter
	    populateFromPagerAdapter();
	  }
	void populateFromPagerAdapter() {
	    removeAllTabs();
	    if (pagerAdapter != null) {
	      final int adapterCount = pagerAdapter.getCount();
	      for (int i = 0; i < adapterCount; i++) {
	        addTab(newTab().setText(pagerAdapter.getPageTitle(i)), false);
	      }
	      ...
	    }
	}
	...
}

可以看到populateFromPagerAdapter方法中执行了removeAllTabs()方法,然后取pagerAdapter.getPageTitle(i)方法返回值重新添加tab,所以记得重写getPageTitle方法。
除了在代码里面动态的添加tab,还可以直接在xml中进行添加TabItem。


tab item

TabLayout属性介绍

TabLayout有很多属性可以供我们使用,下面简单介绍几个。

tabIndicatorFullWidth

上面的运行结果可以看到指示器的整个宽度是充满屏幕的,有时项目需要指示器线条的宽度和文字得宽度一致,那么就可以设置tabIndicatorFullWidth属性为false,默认为true
在这里插入图片描述

tabRippleColor

默认点击每一个tab的时候,会出现渐变的背景色
在这里插入图片描述
如果想要去掉这个点击时的背景,可以通过设置tabRippleColor属性值为一个透明的背景色就可以了


tabTextAppearance

有时候如果设计师需要我们实现,选中的tab文字字体加粗并放大字号,但是TabLayout并没有直接设置字体大小样式的属性,这时候就可以通过设置自定义属性tabTextAppearance来实现,其值是一个自定义style。


        16sp
        bold

appearance
可以看到所有的tab字体都变了,不是我们想要的效果。TabLayout可以设置OnTabSelectedListener监听事件,可以通过选中状态的改变来动态的设置tab样式。下面看看具体的实现逻辑
创建一个tab_text_layout.xml


然后在styles.xml中新建选中和未选中的style


        16sp
        bold
        @color/colorAccent
        14sp
        normal
        @color/grey

最后给TabLayout添加监听事件

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
	@Override
    public void onTabSelected(TabLayout.Tab tab) {
       View customView = tab.getCustomView();
         if (customView == null) {
             tab.setCustomView(R.layout.tab_text_layout);
         }
         TextView textView = tab.getCustomView().findViewById(android.R.id.text1);
         textView.setTextAppearance(TabActivity.this, R.style.TabLayoutTextSelected);
     }
     @Override
     public void onTabUnselected(TabLayout.Tab tab) {
         View customView = tab.getCustomView();
         if (customView == null) {
             tab.setCustomView(R.layout.tab_text_layout);
         }
         TextView textView = tab.getCustomView().findViewById(android.R.id.text1);
         textView.setTextAppearance(TabActivity.this, R.style.TabLayoutTextUnSelected);
     }
     @Override
     public void onTabReselected(TabLayout.Tab tab) {
     }
});

获取tab中的CustomView,为空则设置成我们自己创建的tab_text_layout,然后找到textView的id,最后给textView设置TextAppearance属性。
这里需要注意的是textView的id必须是

android.R.id.text1
,因为从源码中可以看到CustomView获取的是android.R.id.text1。

public class TabLayout extends HorizontalScrollView {
	...
	public final class TabView extends LinearLayout {
		...
		final void update() {
			final Tab tab = this.tab;
	      	final View custom = tab != null ? tab.getCustomView() : null;
	      	...
	        customTextView = custom.findViewById(android.R.id.text1);
	        ...
		}
	}
}

一切修改完毕,重新运行看看效果:
fail
好像有效果了,但是还有点小问题,第一次进去的时候未选中的tab还是使用的默认样式,我们自定义的样式并没有生效,原因是未选中的tab并没有执行到OnTabSelectedListener中的onTabUnselected方法。解决办法是:只需要给TabLayout控件的tabTextAppearance属性设置一个初始的TabLayoutTextUnSelected样式即可。


然后再看看效果:
success

tabMode

tabMode属性用于设置tab是否可以横向滚动,可选的值有fixed(默认)、auto、scrollable。
为了看到更加明显的效果对比,这里又新增几个tab,当设置默认的fixed时,所有的tab都会挤到屏幕上显示
fixed
当设置scrollable时
scrollable
一般tab较少时使用fixed,tab较多时使用scrollable,视项目而定。

tabIndicatorColor

这是属性设置指示器线条的颜色,没什么好讲的

tabIndicatorHeight

这个属性设置指示器的高度,如果我们不需要显示指示器,则可以通过设置tabIndicatorHeight等于0来实现
height is 0

tabIndicatorGravity

这个属性可以设置指示器的显示位置,可选值有bottom(默认)、center、top、stretch。
bottom
bottom

center
center

top
top

stretch
stretch
还有一些其他的属性,可以去官网进行了解。

给TabLayout设置间隔drawable

TabLayout默认每个Tab之间是没有间隔的,实际项目中可能需要给每个Tab之间设置一个小竖线什么的,那么可以通过下面的方法来实现。

LinearLayout linearLayout = (LinearLayout) tabLayout.getChildAt(0);
linearLayout.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
linearLayout.setDividerDrawable(ContextCompat.getDrawable(this,
                R.drawable.layout_divider_vertical));

自定义一个drawable文件,这里自定义一个线条
layout_divider_vertical.xml


在这里插入图片描述可以看到线条的高度是充满了整个TabLayout的,如果我们需要让线条的高度短一点,则可以设置DividerVertical来实现。

LinearLayout linearLayout = (LinearLayout) tabLayout.getChildAt(0);
linearLayout.setDividerPadding(10);

运行结果如下:
在这里插入图片描述好了,TabLayout的基本使用就这些了。

夏云权 原创文章 23获赞 4访问量 1万+ 关注 私信 展开阅读全文
作者:夏云权


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android控件-TabLayout使用介绍

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android控件-TabLayout使用介绍

TabLayout简述简单示例TabLayout属性介绍tabIndicatorFullWidthtabRippleColortabTextAppearancetabModetabIndicatorColortabIndicatorHeig
2022-06-06

Android控件系列之Toast使用介绍

Toast英文含义是吐司,在Android中,它就像烘烤机里做好的吐司弹出来,并持续一小段时间后慢慢消失Toast也是一个容器,可以包含各种View,并承载着它们显示。使用场景: 1、需要提示用户,但又不需要用户点击“确定”或者“取消”按钮
2022-06-06

Android控件系列之CheckBox使用介绍

学习目的: 1、掌握在Android中如何建立CheckBox 2、掌握CheckBox的常用属性 3、掌握CheckBox选中状态变换的事件(监听器) CheckBox简介: CheckBox和Button一样,也是一种古老的控件,它的优
2022-06-06

Android控件系列之TextView使用介绍

学习目的: 1、了解在Android中如何使用TextView控件 2、掌握TextView控件重要属性 作用:TextView类似一般UI中的Label,TextBlock等控件,只是为了单纯的显示一行或多行文本 上图的XML布局如下:
2022-06-06

Android控件系列之Button以及Android监听器使用介绍

学习目的: 1、掌握在Android中如何建立Button 2、掌握Button的常用属性 3、掌握Button按钮的点击事件(监听器) Button是各种UI中最常用的控件之一,它同样也是Android开发中最受欢迎的控件之一,用户可以通
2022-06-06

Android控件系列之XML静态资源使用介绍

学习目的: 1、了解在Android中如何设置和调用XML资源 2、掌握如何利用XML和JAVA代码进行协同开发界面 3、理解R文件的作用 开发Android时,总能看到一个系统自动生成的R.java文件: 您必须了解一下几个要点: 1、
2022-06-06

Android封装Banner控件方法介绍

android-banner实现了一般banner循环轮播的效果,一页只显示一张图片,也可以一页显示一张图和相邻两个图片的一部分,此项目仅仅是banner展示图片,没有多余的诸如指示器、页面切换动画等效果代码,详见效果图和案例代码
2023-03-12

WPF常用控件介绍

WPF(Windows Presentation Foundation)是一种用于创建现代化、丰富的 Windows 桌面应用程序的技术,它提供了一系列常用控件,用于构建用户界面。以下是一些常用的 WPF 控件的介绍:1. Button(按
2023-09-14

Android 布局控件之LinearLayout详细介绍

LinearLayout是线性布局控件,它包含的子控件将以横向或竖向的方式排列,按照相对位置来排列所有的widgets或者其他的containers,超过边界时,某些控件将缺失或消失。因此一个垂直列表的每一行只会有一个widget或者是co
2022-06-06

android TabLayout使用方法详解

Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个support库里面,Google给我们提供了更
2022-06-06

Android View Binding使用介绍

前言 Android Studio稳定版发布了3.6版本,带来了一些新变化:首先外观,启动页变了,logo改了,更显现代化;增加Multi Preview功能,能同时预览多个尺寸屏幕的显示效果;模拟器支持多屏;也终于支持全新的视图绑定组件V
2022-06-06

Android自定义控件属性详细介绍

Android自定义控件属性详细介绍1. reference:参考某一资源ID。 (1)属性定义: 2023-05-31

Android- Widget (应用微件/小组件/插件) 使用介绍

一、概念: App Widget 即叫 应用微件 或者 小组件/插件. 是可以嵌入其他应用(如主屏幕)并 接收定期更新的微型应用视图。 这些视图称为界面中的微件. 例如,添加到桌面上的音乐Widget: app_widget_music_
2023-08-23

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录