主页tab是必须会有的,各种实现也很多。各有千秋。但目标都是简单、可控。今天用ConstraintLayout+radioGroup做一个tab。简单性可控性都还可以。本文目的把ConstraintLayout用起来。有需要的可以直接拿去用。

看一下效果

列下关键问题:

1.当然是切换tab.用radiogroup实现。

2.选中tab要1)字体颜色变换2)icon变换3)背景变换

3.去掉checked的那个小圈圈。

4.做上红点提示。

下面一个个来实现

第一步

ConstraintLayout 做根节点来布局。(android studio 2.2 以上)

第二步来个radiogroup

看一下RadioGroup怎么放:

 <RadioGroup
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_marginBottom="0dp"
android:layout_marginLeft="0dp"
android:layout_marginRight="0dp"
android:checkedButton="@+id/radioButton"
android:orientation="horizontal"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
tools:ignore="MissingConstraints">
</RadioGroup>

 主要操作:在design界面把RG拖到底部,去掉padding. 

第三步来4个radiobutton

把layout_width去掉,都设为0dp。layout_weight=“1“

然后看到应该是如下这样的

第四步:不需要左右圈圈。

设置方法

android:button="@null"

文字居中

android:textAlignment="center"

文字颜色:

这里文字需要两个颜色,选中和非选中。那么需要一个selector.

 <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/color_tab_selected" android:state_checked="true"></item>
<item android:color="@color/color_tab_unselected" android:state_checked="false"></item>
</selector>

icon设置:

也需要两个icon切换,选中与非选中

需要一个selector

 <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/ic_my_checked" android:state_checked="true"></item>
<item android:drawable="@mipmap/ic_my_unchecked" android:state_checked="false"></item>
</selector>

设置背景:同样需要一个selector

 <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/color_tab_selected" android:state_checked="false"></item>
<item android:drawable="@color/color_tab_unselected" android:state_checked="true"></item>
</selector>

几个点需要注意:文字跟icon距离 可以通过

android:drawablePadding来设置
经过以上步奏:
定义出来一radiobutton的样式是这样的:
  <style name="main_tab">
<item name="android:padding">5dp</item>
<item name="android:drawablePadding">5dp</item>
<item name="android:background">@drawable/main_tab_bg_selector</item>
<item name="android:textSize">12sp</item>
<item name="android:textColor">@drawable/main_tab_text_color_selector</item>
<item name="android:textAlignment">center</item>
<item name="android:layout_weight">1</item>
<item name="android:layout_width">0dp</item>
<item name="android:button">@null</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:focusable">true</item>
<item name="android:clickable">true</item>
</style>

然后台可以看到布局出来了。

到这儿基本完成90%了。基本可以用了。

但是现在应用往往有小点提示。

很多人想着在radiobutton里做文章,搞来搞去,结果很麻烦。我觉得还另起一层,分开了搞。只是相对位置弄好就行了。

第五步来实现小红点。

ConstraintLayout又派上用场了,比相对布局牛X,可以添加基准线,可以按百分比来。

那就来几条:

  <android.support.constraint.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.125" /> <android.support.constraint.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_end="45dp" /> <android.support.constraint.Guideline
android:id="@+id/guideline3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.375" /> <android.support.constraint.Guideline
android:id="@+id/guideline4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.625" /> <android.support.constraint.Guideline
android:id="@+id/guideline5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.875" />

好了,再来几个textview按照guideline去布局。

显示不显示都很好控制。OK基本完成。

粘上整个代码:

 <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.lechang.MainActivity"> <RadioGroup
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_marginBottom="0dp"
android:layout_marginLeft="0dp"
android:layout_marginRight="0dp"
android:checkedButton="@+id/radioButton"
android:orientation="horizontal"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
tools:ignore="MissingConstraints"> <RadioButton
android:id="@+id/ra_qulity"
style="@style/main_tab"
android:background="@drawable/main_tab_bg_selector"
android:checked="true"
android:drawableTop="@drawable/main_tab_my_selector"
android:text="@string/str_qulity" /> <RadioButton
android:id="@+id/ra_rink"
style="@style/main_tab"
android:drawableTop="@drawable/main_tab_my_selector"
android:text="@string/str_rink" /> <RadioButton
android:id="@+id/ra_dynamic"
style="@style/main_tab"
android:drawableTop="@drawable/main_tab_my_selector"
android:text="@string/str_dynamic" /> <RadioButton
android:id="@+id/ra_my"
style="@style/main_tab"
android:drawableTop="@drawable/main_tab_my_selector"
android:text="@string/str_my" />
</RadioGroup> <android.support.constraint.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.125" /> <android.support.constraint.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_end="45dp" /> <android.support.constraint.Guideline
android:id="@+id/guideline3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.375" /> <android.support.constraint.Guideline
android:id="@+id/guideline4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.625" /> <android.support.constraint.Guideline
android:id="@+id/guideline5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.875" /> <TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="10dp"
android:layout_marginLeft="10dp"
android:background="@drawable/main_tab_tip_rectangle_red_bg"
android:gravity="center"
android:minHeight="5dp"
android:minWidth="10dp"
android:text="99"
android:textColor="@color/white"
android:textSize="5sp"
app:layout_constraintLeft_toLeftOf="@+id/guideline"
app:layout_constraintTop_toTopOf="@+id/guideline2" /> <TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="10dp"
android:layout_marginLeft="10dp"
android:background="@drawable/main_tab_tip_rectangle_red_bg"
android:gravity="center"
android:minHeight="5dp"
android:minWidth="10dp"
android:text="99"
android:textSize="5sp"
app:layout_constraintLeft_toLeftOf="@+id/guideline3"
app:layout_constraintTop_toTopOf="@+id/guideline2" /> <TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="10dp"
android:layout_marginLeft="10dp"
android:background="@drawable/main_tab_tip_rectangle_red_bg"
android:gravity="center"
android:minHeight="5dp"
android:minWidth="10dp"
android:text="99"
android:textSize="5sp"
app:layout_constraintLeft_toLeftOf="@+id/guideline4"
app:layout_constraintTop_toTopOf="@+id/guideline2" /> <TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="10dp"
android:layout_marginLeft="10dp"
android:background="@drawable/main_tab_tip_rectangle_red_bg"
android:gravity="center"
android:minHeight="5dp"
android:minWidth="10dp"
android:text="99"
android:textSize="5sp"
app:layout_constraintLeft_toLeftOf="@+id/guideline5"
app:layout_constraintTop_toTopOf="@+id/guideline2" /> </android.support.constraint.ConstraintLayout>

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#f00"></solid>
<corners android:radius="5dp"></corners>
</shape>

ConstraintLayout+radioGroup做一个tab.简单好用。的更多相关文章

  1. 尝试做一个.NET简单、高效、避免OOM的Excel工具

    Github : https://github.com/shps951023/MiniExcel 简介 我尝试做一个.NET简单.高效.避免OOM的Excel工具 目前主流框架大多将资料全载入到记忆体 ...

  2. 一听就懂:用Python做一个超简单的小游戏

    写它会用到 while 循环random 模块if 语句输入输出函数

  3. sweiper做一个tab切换

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. C#做一个简单的进行串口通信的上位机

    C#做一个简单的进行串口通信的上位机   1.上位机与下位机 上位机相当于一个软件系统,可以用于接收数据.控制数据.即可以对接收到的数据直接发送操控命令来操作数据.上位机可以接收下位机的信号.下位机是 ...

  5. 【Bugly干货分享】一起用 HTML5 Canvas 做一个简单又骚气的粒子引擎

    Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 前言 好吧,说是“粒子引擎”还是大言不 ...

  6. 使用React并做一个简单的to-do-list

    1. 前言 说到React,我从一年之前就开始试着了解并且看了相关的入门教程,而且还买过一本<React:引领未来的用户界面开发框架 >拜读.React的轻量组件化的思想及其virtual ...

  7. 【 D3.js 入门系列 --- 3 】 做一个简单的图表!

    前面说了几节,都是对文字进行处理,这一节中将用 D3.js 做一个简单的柱形图. 做柱形图有很多种方法,比如用 HTML 的 div 标签,或用 svg . 推荐用 SVG 来做各种图形.SVG 意为 ...

  8. 一起用HTML5 canvas做一个简单又骚气的粒子引擎

    前言 好吧,说是"粒子引擎"还是大言不惭而标题党了,离真正的粒子引擎还有点远.废话少说,先看demo 本文将教会你做一个简单的canvas粒子制造器(下称引擎). 世界观 这个简单 ...

  9. Jmeter初步使用二--使用jmeter做一个简单的性能测试

    经过上一次的初步使用,我们懂得了Jmeter的安装与初步使用的方法.现在,我们使用Jmeter做一个简单的性能测试.该次测试,提交的参数不做参数化处理,Jmeter各元件使用将在介绍在下一博文开始介绍 ...

随机推荐

  1. Java常见异常处理

    Exception类: 在java中用类的形式对不正常情况进行了描述和封装对象,异常就是java通过面向对象的思想将问题封装成了对象. 异常发生的原因有很多,通常包含以下几大类: 用户输入了非法数据. ...

  2. 容器中使用iptables报错can't initialize iptables table Permission denied (you must be root)

    背景 在docker容器中部署了一微服务,该服务需要docker push镜像到docker registry.因此,docker容器中需要安装docker服务.但在启动容器的时候,却报错: can' ...

  3. 从一个简单案例上手Spring MVC,同时分析Spring MVC面试问题

    很多公司都会用Spring MVC,而且初级程序员在面试时,一定会被问到这方面的问题,所以这里我们来通过一个简单的案例来分析Spring MVC,事实上,我们在培训中就用这个举例,很多零基础的程序员能 ...

  4. python日记

    今天学习了Python的一些基本知识,就是简单的输入输出.因为我安装的Python环境是3.6版本的,因此我说的自己体会到的问题都是基于这个版本而得出的问题,说一下今天感觉要注意的要点吧. 1.首先是 ...

  5. PHP四种基本排序算法

    PHP的四种基本排序算法为:冒泡排序.插入排序.选择排序和快速排序. 下面是我整理出来的算法代码: 1. 冒泡排序: 思路:对数组进行多轮冒泡,每一轮对数组中的元素两两比较,调整位置,冒出一个最大的数 ...

  6. Cloud9 on Docker镜像发送

    老外有做过几个cloud9的镜像,但是都有各种各样的问题. 小弟在此做了一个docker镜像,特此分享,希望各位大佬多提宝贵意见.谢谢. Cloud9 Online IDE Coding anywhe ...

  7. 用C写的计算运行时间

    #include <stdio.h> #include <stdlib.h> #include <time.h> int main( void ) { long i ...

  8. 最新数据库排行,Oracle略显疲惫

    9月份TOPDB Top Database Index排行榜出炉,TOPDB Top Database Index是根据数据库在谷歌上的搜索频率分析得出的,数据库被搜索的频率越大,表示数 9月份的TO ...

  9. mybatis 分页问题 (个人认为算是个bug)

    问题描述:相同的查寻条件, 分页显示的结果和.net版本的分页结果数量一样,排序不一样, 不同的页有相同的数据.比如:第2面和第3页都有同一条相同的数据. 核心代码: //自己实现 int total ...

  10. lua中的require机制

    lua中的require机制 为了方便代码管理,通常会把lua代码分成不同的模块,然后在通过require函数把它们加载进来.现在看看lua的require的处理流程.1.require机制相关的数据 ...