android组合控件 重叠,Android 组合控件实现布局的复用的方法

看到很多项目会有实现自己的标题栏的做法,通常的界面是左边按钮或文字,加上中间的标题和右边的按钮或文字组成的。比较好的一种做法是使用include标签,复用同一个xml文件来实现布局的复用。但是这种方法是通过代码的方式来设置标题,左右按钮等其他的属性,会导致布局属性和Activity代码耦合性比较高。

因此,我们要通过自定义View,继承ViewGroup子类来实现这样的布局,降低布局文件和Activity代码耦合性。

首先,我们需要写出布局文件layout_custom_titlebar.xml。

android:id="@+id/title_bar_left"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:layout_centerVertical="true"

android:layout_marginLeft="5dp"

android:background="@null"

android:minHeight="45dp"

android:minWidth="45dp"

android:textSize="14sp" />

android:id="@+id/title_bar_title"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerInParent="true"

android:singleLine="true"

android:textSize="17sp" />

android:id="@+id/title_bar_right"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:layout_centerVertical="true"

android:layout_marginRight="7dp"

android:background="@null"

android:minHeight="45dp"

android:minWidth="45dp"

android:textSize="14sp" />

2.定义自定义属性

3.自定义一个View继承ViewGroup子类,这里我们继承RelativeLayout。

public class CustomTitleBar extends RelativeLayout {

private Button titleBarLeftBtn;

private Button titleBarRightBtn;

private TextView titleBarTitle;

public CustomTitleBar(Context context) {

super(context);

}

public CustomTitleBar(Context context, AttributeSet attrs) {

super(context, attrs);

LayoutInflater.from(context).inflate(R.layout.layout_custom_titlebar,this,true);

titleBarLeftBtn = (Button) findViewById(R.id.title_bar_left);

titleBarRightBtn = (Button) findViewById(R.id.title_bar_right);

titleBarTitle = (TextView) findViewById(R.id.title_bar_title);

TypedArray typedArray=context.obtainStyledAttributes(attrs,R.styleable.CustomTitleBar);

if(typedArray!=null){

//titleBar背景色

int titleBarBackGround=typedArray.getResourceId(R.styleable.CustomTitleBar_title_background_color, Color.BLUE);

setBackgroundColor(titleBarBackGround);

//获取是否要显示左边按钮

boolean leftButtonVisible = typedArray.getBoolean(R.styleable.CustomTitleBar_left_button_visible, true);

if (leftButtonVisible) {

titleBarLeftBtn.setVisibility(View.VISIBLE);

} else {

titleBarLeftBtn.setVisibility(View.INVISIBLE);

}

//设置左边按钮的文字

String leftButtonText = typedArray.getString(R.styleable.CustomTitleBar_left_button_text);

if (!TextUtils.isEmpty(leftButtonText)) {

titleBarLeftBtn.setText(leftButtonText);

//设置左边按钮文字颜色

int leftButtonTextColor = typedArray.getColor(R.styleable.CustomTitleBar_left_button_text_color, Color.WHITE);

titleBarLeftBtn.setTextColor(leftButtonTextColor);

} else {

//设置左边图片icon 这里是二选一 要么只能是文字 要么只能是图片

int leftButtonDrawable = typedArray.getResourceId(R.styleable.CustomTitleBar_left_button_drawable, R.mipmap.titlebar_back_icon);

if (leftButtonDrawable != -1) {

titleBarLeftBtn.setBackgroundResource(leftButtonDrawable);

}

}

//先获取标题是否要显示图片icon

int titleTextDrawable = typedArray.getResourceId(R.styleable.CustomTitleBar_title_text_drawable, -1);

if (titleTextDrawable != -1) {

titleBarTitle.setBackgroundResource(titleTextDrawable);

} else {

//如果不是图片标题 则获取文字标题

String titleText = typedArray.getString(R.styleable.CustomTitleBar_title_text);

if (!TextUtils.isEmpty(titleText)) {

titleBarTitle.setText(titleText);

}

//获取标题显示颜色

int titleTextColor = typedArray.getColor(R.styleable.CustomTitleBar_title_text_color, Color.WHITE);

titleBarTitle.setTextColor(titleTextColor);

}

//获取是否要显示右边按钮

boolean rightButtonVisible = typedArray.getBoolean(R.styleable.CustomTitleBar_right_button_visible, true);

if (rightButtonVisible) {

titleBarRightBtn.setVisibility(View.VISIBLE);

} else {

titleBarRightBtn.setVisibility(View.INVISIBLE);

}

//设置右边按钮的文字

String rightButtonText = typedArray.getString(R.styleable.CustomTitleBar_right_button_text);

if (!TextUtils.isEmpty(rightButtonText)) {

titleBarRightBtn.setText(rightButtonText);

//设置右边按钮文字颜色

int rightButtonTextColor = typedArray.getColor(R.styleable.CustomTitleBar_right_button_text_color, Color.BLUE);

titleBarRightBtn.setTextColor(rightButtonTextColor);

} else {

//设置右边图片icon 这里是二选一 要么只能是文字 要么只能是图片

int rightButtonDrawable = typedArray.getResourceId(R.styleable.CustomTitleBar_right_button_drawable, -1);

if (rightButtonDrawable != -1) {

titleBarRightBtn.setBackgroundResource(rightButtonDrawable);

}

}

typedArray.recycle();

}

}

public void setTitleClickListener(OnClickListener onClickListener) {

if (onClickListener != null) {

titleBarLeftBtn.setOnClickListener(onClickListener);

titleBarRightBtn.setOnClickListener(onClickListener);

}

}

public Button getTitleBarLeftBtn() {

return titleBarLeftBtn;

}

public Button getTitleBarRightBtn() {

return titleBarRightBtn;

}

public TextView getTitleBarTitle() {

return titleBarTitle;

}

}

4.正确地使用它

xmlns:app="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/ctb_view"

android:layout_width="match_parent"

android:layout_height="45dp"

app:right_button_drawable="@mipmap/sure"

app:title_text="@string/app_name" />

android:layout_width="match_parent"

android:layout_height="45dp"

android:layout_marginTop="4dp"

app:title_background_color="@color/colorPrimary"

app:title_text="@string/app_name"

app:title_text_color="@color/colorAccent"

app:left_button_text="左边"

app:right_button_text="右边"/>

android:layout_width="match_parent"

android:layout_height="45dp"

android:layout_marginTop="4dp"

app:title_text_drawable="@mipmap/ic_launcher"

app:title_background_color="@color/colorAccent"

app:left_button_text="左边"

app:right_button_text="右边"/>

a1427d7a5522d93c4c38439c784f16d4.png

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1到100的偶数之和是多少_新射雕群侠传之铁血丹心手游新侠客独孤求败全渠道上线 新玩法桃花岛开启...

点击上面蓝字获取更多精彩资讯金庸正版授权手游《新射雕群侠传之铁血丹心》新英雄独孤求败傲世登场,桃花岛新惊喜即将海量释放!国庆最长假期即将到来,《新射雕群侠传》玩法福利再度升级,不止是神话品质独孤求败的安卓全渠道开放,更…

python顺序结构实验_Python程序设计实验报告二:顺序结构程序设计(验证性实验)...

安徽工程大学 Python程序设计实验报告 班级物流192姓名芦靓学号3190505217成绩 日期2020.3.19 指导老师修宇 【实验名称】 实验二 顺序结构程序设计(验证性实验) 【实验目的】 (1)掌握数据的输入输出的方法; &#xff…

三星s9android recovery,三星手机怎么进入recovery模式?详细图文教程指导

【刷机之家】其实对于经常刷机的朋友来说进入recovery模式是一件再正常不过的事情了,但是对于很多刚刚接触刷机的新手朋友来说可能不太了解,当你仔细阅读完本教程之后相信即使你是一个完全不了解刷机的朋友也会知道该如何进入recovery模式。本教程主要是…

css布局方式_网页布局都有哪种?一般都用什么布局?

随着Web技术不断的革新,CSS近几年也变得多年前要更强大。在Web开发中,CSS是不可或缺的一部分,对于很多Web开发者来说,有很多CSS属性不知道,或者说他们知道,但忘记在最恰当的时候使用最适合的CSS属性。而且时…

复合消隐信号的作用_南大《AFM》:可拉缩、粘合、导电的双信号柔性彩色薄膜...

导读:本文得到了一种可伸缩、可粘合、可自修复、可导电的双信号柔性电子结构彩色薄膜,具有很大的应用潜力。柔性电子设备在各种应用中发挥着不可忽视的作用,如健康监控、感觉皮肤、可植入设备等。柔性电子材料的研究已取得了很大进展&#xf…

三轴加速度传感器和六轴惯性传感器_一文读懂汽车MEMS惯性传感器的七大应用(上)...

本文中,我们将研究汽车MEMS惯性传感器的应用,描述它们的工作原理,并讨论如何利用MEMS惯性传感器来实现更大的应用改进。 当前,微机电系统(MEMS)传感器已被大多数汽车工程师视为尖端技术或边缘技术&#xff…

criteria函数_干货铺 | 二级MS office考试中一些常考函数(2)

同步文章:二级MS office考试中一些常考函数(2)1.AVERAGE(Number1,Number2,…)函数——计算平均值函数:参数解释:Number1,number2,...是要计算平均值的 1~255 个参数。2.averageif(ra…

html中图片透明度渐变效果,css怎么设置透明度渐变?

css怎么设置透明度渐变?下面本篇文章给大家介绍一下使用CSS设置透明度渐变效果的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。css怎么设置透明度渐变?在CSS中可以使用linear-gradient()函数配合rgba()来…

oc 画一个圆弧_SolidWorks一步扫描特征,就可以画出一个螺母,你有思路吗

建模过程:1.在【上视基准面】画一个六边形。(引导线)1-1.圆角,半径:2 ,框选六边形。2.在【前视基准面】画草图如下:(轮廓)2-1.左侧画一段竖直构造线,端点与圆弧穿透几何关系。3.【线段】草图绘制点&#xf…

python默认安装位置_如何更改python中pip的默认安装路径

具体方法: 1、查看 site.py 文件的位置(一般在python安装目录的\Lib下),可使用指令查询:python -m site -help2、打开site.py文件,更改 USER_BASE 和USER_SITE 的路径即可。其中 USER_BASE 和USER_SITE其实就是用户自定…

java被电脑阻止怎么办_学电脑,一定要记住的6个常用命令,它能让你快速成为电脑达人...

电脑对于我们所有人来说都是一项非常伟大的发明。目前,在我们的生活中它已经成为了一个不可或缺的工具。时时围绕在我们的周围,如果离开电脑,可以说很多人都将寸步难行,科技也得不到发展。那么作为电脑的初学者,我们该…

动词ing形式的5种用法_英语语法这样学就对了!动词-ing结构的特征和四种形式是?...

想彻底学好英语一定要善于总结语法!动词-ing结构的特征和四种形式都是什么?想彻底学好英语,语法这一关是一定要过的。我将通过这个平台定期更新实用、常用的英语语法知识解读,直至覆盖完全部的英语语法知识点,使你通过…

mysql 数据迁移_【AWS 功能】Mysql 数据库迁移至Amazon RDS方案

今天,我们讲讲如何使用源MySQL数据库执行数据库迁移到MySQL数据库的目标Amazon RDS的方案,同时由于(源和目标数据库引擎是相同的)——模式结构、数据类型和数据库代码在源和目标数据库之间是兼容的,这意味着这种迁移不需要任何模式转换。数据…

eclipse run on server 点不了finish_分享点经验 | springboot入门及编码

点击蓝字关注我们AMP很多新人在刚刚接触后端开发的时候,可能对springboot的概念、如何快速上手一个springboot项目多多少少有些一知半解;此外写出来的代码也因为不够规范而可读性较低,导致后期难以维护。本文旨在站在新手的视角,尽…

mac redis 客户端_分享一个免费好用的Redis桌面客户端

今天波波为做开发的朋友们分享一个免费好用的Redis桌面客户端。这个工具纯属机缘巧合下发现的,前几天波波在开发一个物联网平台,硬件通信部分用了Workman Gateway来负责通信和消息推送,结果因为自己把官方的文档理解错误,遇到了一…

实测实量数据表格_建筑工程质量实测实量操作手册,130页PPT下载!

来源:百度文库版权归原作者所有文件下载方式在最后第一篇 总 则1、适用范围2、取样总则第二篇 尺差控制篇1、混凝土结构工程2、实测实量数据、水平基准线上墙3、砌体工程4、抹灰工程5、设备安装6、涂饰工程7、饰面墙砖(石材)工程8、地面饰面砖(石材)工程9、吊…

0018计算机基础知识,0018 0019计算机应用基础上机试题

满意答案pgeqanyyafe2013.02.23采纳率:51% 等级:12已帮助:6328人有2套:复制发给你? 还是通过QQ发给你呢? 还是给你发到邮箱呢?第一套:《计算机应用基础》上机考试试题 姓名&…

java接口测试工具_【分享】接口工具对比(apipost、jmeter、postman、swagger等)

一、接口都有哪些类型?接口一般分为两种:1.程序内部的接口 2.系统对外的接口系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把 数据库共享给你,他只能给你提供一个他们写好的方法来获取数据…

用flash做古诗动画_带孩子用两张A4纸做动画(内附资源可下载)

不要让孩子在成长过程中丢失了对自然的好奇心,在自然科学(物理,化学,生物,天文......)的实验中快乐成长,热爱生活,保护环境,探索精彩世界。科学爸爸的孩子从2014年四岁多开始对科学产生了浓厚兴…

promise的状态以及api介绍_2019年,盘点一些我出过的前端面试题以及对求职者的建议

笔者虽然曾经也面试过很多求职者,但是对于前端的笔试和面试,我觉得并不能体现一个人的真实能力,所以建议大家多修炼前端真正的技术.对于前端面试题,之前也承诺过读者要出一篇,笔者大致总结一下曾经面试的题目.后续不会再出面试题,而是聚焦于一些真正的,有利于成长性的技术文章和…