安卓自定义组合控件--toolbar
最近在学习安卓APP的开发,用到了toolbar这个控件, 最开始使用时include layout这种方法,不过感觉封装性不好,就又改成了自定义组合控件的方式。
使用的工具为android studio 2.2,简称AS吧
1.首先创建一个新的自定义控件,如下图。AS会创建3个文件, 一个java文件,一个layout中的xml文件(这个是布局文件),一个values中的xml文件(这个是属性文件)

2. 修改布局文件,代码如下。这里使用了RelativeLayout, 并且宽度和高度都选择了match_parent, 真实的宽度是在调用控件的地方写。
布局很简单, 左边后退按钮(可定义onclick方法),中间标题,右边功能按钮(可隐藏,可更换图标,可定义onclick方法)
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar_all1"
android:layout_width="match_parent"
android:layout_height="match_parent"> <ImageView
android:id="@+id/toolbar_left_button1"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:src="@mipmap/ic_top_back"/> <TextView
android:id="@+id/toolbar_title1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/toolbar_text"
android:textSize="@dimen/toolbar_text_size"/> <ImageView
android:id="@+id/toolbar_right_button1"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="10dp"/> </RelativeLayout>
3. 修改属性文件,这里就定义了一个属性titleText, 用于在布局文件中给toolbar设置title
<resources>
<declare-styleable name="ToolbarControl">
<attr name="titleText" format="string"/>
</declare-styleable>
</resources>
4.修改java文件。ToolbarControl类是继承与Toolbar类的。定义了titleStr属性,并且生成getter和setter,这里要和属性文件中定义的属性名一致,类型也要一致,否则会有问题。
还定义了代码设置title,代码设置右边功能菜单的图标、onclick事件。以及左边后退按钮的onclick事件(本来想把后退封装在控件里面,但是没找到好的方法,只能从调用的地方添加个OnclickListenser, 如有方法封装到控件里面,请指教)
public class ToolbarControl extends Toolbar {
private static final String TAG = ToolbarControl.class.getSimpleName();
private String titleText;
@BindView(R.id.toolbar_left_button1)
public ImageView leftButton;
@BindView(R.id.toolbar_title1)
public TextView titleTextView;
@BindView(R.id.toolbar_right_button1)
public ImageView rightButton;
public ToolbarControl(Context context) {
super(context);
init(context, null);
}
public ToolbarControl(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
View view = LayoutInflater.from(context).inflate(R.layout.toolbar_control, this, true);
ButterKnife.bind(this, view);
//很重要
setContentInsetsRelative(0, 0);
// Load attributes
final TypedArray a = getContext().obtainStyledAttributes(
attrs, R.styleable.ToolbarControl, 0, 0);
titleText = a.getString(R.styleable.ToolbarControl_titleText);
Log.d(TAG, titleText);
titleTextView.setText(titleText);
a.recycle();
}
public void setTitle(String titleStr) {
if (titleTextView != null) {
titleTextView.setText(titleStr);
}
}
public void setTitleByResourceId(int rid) {
if (titleTextView != null) {
titleTextView.setText(rid);
}
}
public void setRightButtonImage(int resourceId) {
if (rightButton != null) {
rightButton.setImageResource(resourceId);
}
}
public void showImage() {
if (rightButton != null) {
rightButton.setVisibility(View.VISIBLE);
}
}
public void hideImage() {
if (rightButton != null) {
rightButton.setVisibility(View.GONE);
}
}
public void hide() {
this.setVisibility(View.GONE);
}
public void setBackButtonOnClickListerner(OnClickListener listerner) {
if (leftButton != null && listerner != null) {
leftButton.setOnClickListener(listerner);
}
}
public void setButtonOnClickListener(OnClickListener listener) {
if (rightButton != null && listener != null) {
rightButton.setOnClickListener(listener);
}
}
public String getTitleText() {
return titleText;
}
public void setTitleText(String titleText) {
this.titleText = titleText;
}
}
5. 布局中引用, 这里要设置控件的颜色、height也设置成wrap_content,并设置minHeight为?attr/actionBarSize
<com.example.ben.tracktest.controls.ToolbarControl
android:id="@+id/about_me_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:titleText="@string/about_me_title"> </com.example.ben.tracktest.controls.ToolbarControl>
6. 代码中初始化控件。 首先将空间设置为support actionbar, 之后禁止显示自动的title, 然后设置 后退按钮的事件(就是finish),设置右边功能菜单的图标,和点击事件
private void initToolBar() {
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
toolbar.setBackButtonOnClickListerner(new View.OnClickListener() {
@Override
public void onClick(View view) {
AboutMeActivity.this.finish();
}
});
toolbar.setRightButtonImage(R.drawable.me);
toolbar.setButtonOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//你自己的功能
}
});
}
好了,一个完整的toolbar控件极其调用功能已经完成了。看下效果吧。

如果有问题,请指教
安卓自定义组合控件--toolbar的更多相关文章
- Android自定义控件之自定义组合控件
前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...
- Android 手机卫士--自定义组合控件构件布局结构
由于设置中心条目中的布局都很类似,所以可以考虑使用自定义组合控件来简化实现 本文地址:http://www.cnblogs.com/wuyudong/p/5909043.html,转载请注明源地址. ...
- Android开发之自定义组合控件
自定义组合控件的步骤1.自定义一个View,继承ViewGroup,比如RelativeLayout2.编写组合控件的布局文件,在自定义的view中加载(使用View.inflate())3.自定义属 ...
- 自定义组合控件,适配器原理-Day31
自定义组合控件,适配器原理-Day31 mobile2.1 主页定义 手机上锁功能 1.弹出设置密码框. 手机下载进度 自定定义控件 控件的属性其实就是控件类一个属性设置属性调用类的set方法方法, ...
- 安卓自定义日期控件(仿QQ,IOS7)
还记得上篇:高大上的安卓日期时间选择器,本篇是根据上篇修改而来,先看下qq中日期选择的效果: 鉴于目前还没有相似的开源日期控件,因此本人花费了一些时间修改了下之前的日期控件,效果如图: 虽说相似度不是 ...
- Android Studio自定义组合控件
在Android的开发中,为了能够服用代码,会把有一定共有特点的控件组合在一起定义成一个自定义组合控件. 本文就详细讲述这一过程.虽然这样的View的组合有一个粒度的问题.粒度太大了无法复用,粒度太小 ...
- Android自定义组合控件详细示例 (附完整源码)
在我们平时的Android开发中,有时候原生的控件无法满足我们的需求,或者经常用到几个控件组合在一起来使用.这个时候,我们就可以根据自己的需求创建自定义的控件了,一般通过继承View或其子类来实现. ...
- Android开发学习笔记-自定义组合控件的过程
自定义组合控件的过程 1.自定义一个View 一般来说,继承相对布局,或者线性布局 ViewGroup:2.实现父类的构造方法.一般来说,需要在构造方法里初始化自定义的布局文件:3.根据一些需要或者需 ...
- Android中自定义组合控件
Android中自定义控件的情况非常多,一般自定义控件可以分为两种:继承控件及组合控件.前者是通过继承View或其子类,重写方法实现自定义的显示及事件处理方式:后者是通过组合已有的控件,来实现结构的简 ...
随机推荐
- 干货来袭-整套完整安全的API接口解决方案
在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...
- 简单粗暴地理解js原型链--js面向对象编程
原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...
- ABP框架 - OData 集成
文档目录 本节内容: 简介 安装 安装Nuget包 设置模块依赖 配置你的实体 创建控制器 示例 获取实体列表 请求 响应 获取单个实体 请求 响应 获取单个实体及导航属性 请求 响应 查询 请求 响 ...
- Linux中进行单文件内容的复制
文件内容复制的常规方法: 开辟一段空间,不断读取文件的内容并写入另一文件当中,这种方法好在安全,一般在类型允许的最大范围内是安全的,缺点就是复制内容的时间长 一次性复制文件的内容,这种方法必须首先获取 ...
- 8.仿阿里云虚拟云服务器的FTP(包括FTP文件夹大小限制)
平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html#iis 原文:http://dnt.dkill.net/Ar ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(65)-MVC WebApi 用户验证 (1)
系列目录 前言: WebAPI主要开放数据给手机APP,其他需要得知数据的系统,或者软件应用,所以移动端与系统的数据源往往是相通的. Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能, ...
- node中的Stream-Readable和Writeable解读
在node中,只要涉及到文件IO的场景一般都会涉及到一个类-Stream.Stream是对IO设备的抽象表示,其在JAVA中也有涉及,主要体现在四个类-InputStream.Reader.Outpu ...
- JavaScript中事件处理
先看看下面一道题目,请评价以下代码并给出改进意见: if (window.addEventListener) {//标准浏览器 var addListener = function(el, type, ...
- 一起学 Java(二)面向对象
一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...
- [干货来袭]MSSQL Server on Linux预览版安装教程(先帮大家踩坑)
前言 昨天晚上微软爸爸开了全国开发者大会,会上的内容,我就不多说了,园子里面很多.. 我们唐总裁在今年曾今透漏过SQL Server love Linux,果不其然,这次开发者大会上就推出了MSSQL ...