自定义Toolbar实现简洁标题栏
2017-03-05 19:04
357 查看
项目中,我们会大量的使用到标题栏,使用google推荐的toolbar,可以创造出使用简便的简洁标题栏.方便我们使用.
由于我们使用的标题栏大多需要标题居中显示,而toolbar自带的标题不是居中显示,我们可以自定义toolbar布局,解决这一问题.
自定义toolbar布局
我们创建一个布局,里面包含三个textview,分别在左侧,右侧和中间.
然后,我们创建自定义toolbar类,继承自Toolbar.并将布局载入.
这时,最基本的标题栏就已经做好了.在里面的布局已经可以显示出来.我们需要根据自己的需求进去扩展.
比如:
可以自由设置背景色
可以只显示标题栏,不显示左右文本
可以将文本替换成图片
可以响应点击事件
…
前面两项都十分简单,就略过了.
关于图片文本自由更换,我的思路是需要设置图片时,将文本置为空,设置textview的drawableLeft或者drawableRight.
关于响应点击事件,则使用接口和回调就可以解决.
使用自定义toolbar,以MainActivity为例,
首先将activity的theme设置为noactionbar,
在布局中直接加入.
可以看到效果了:
我们想要改变颜色
效果:
设置只需要标题
效果:
设置点击事件
效果:
将文本切换成图片
效果:
可以看到,使用起来非常简单,以后遇到特殊情况可以继续进行扩展.
代码不多,直接贴出自定义view的源码.
由于我们使用的标题栏大多需要标题居中显示,而toolbar自带的标题不是居中显示,我们可以自定义toolbar布局,解决这一问题.
自定义toolbar布局
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/toolbar_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorAccent" > <TextView android:id="@+id/toolbar_left" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:singleLine="true" android:text="左侧文本" android:gravity="center" android:textColor="@color/white" android:textSize="16dp" android:visibility="visible" /> <TextView android:id="@+id/toolbar_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:singleLine="true" android:textColor="@android:color/white" android:text="标题" android:textSize="20dp" android:visibility="visible" /> <TextView android:id="@+id/toolbar_right" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:layout_marginRight="10dp" android:gravity="center" android:visibility="visible" android:text="右侧文本" android:textColor="@color/white" android:textSize="16dp" /> </android.support.v7.widget.Toolbar>
我们创建一个布局,里面包含三个textview,分别在左侧,右侧和中间.
然后,我们创建自定义toolbar类,继承自Toolbar.并将布局载入.
public class CustomToolbar extends Toolbar { private TextView lefttext; private TextView titletext; private TextView righttext; private Toolbar toolbar; public CustomToolbar(Context context) { this(context, null); } public CustomToolbar(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CustomToolbar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); inflate(context, R.layout.view_customtoolbar,this); } }
这时,最基本的标题栏就已经做好了.在里面的布局已经可以显示出来.我们需要根据自己的需求进去扩展.
比如:
可以自由设置背景色
可以只显示标题栏,不显示左右文本
可以将文本替换成图片
可以响应点击事件
…
前面两项都十分简单,就略过了.
关于图片文本自由更换,我的思路是需要设置图片时,将文本置为空,设置textview的drawableLeft或者drawableRight.
/** * 设置左侧文本 * @param text */ public void setLeftText(String text) { lefttext.setVisibility(VISIBLE); lefttext.setText(text); //设置文本则不显示图片 lefttext.setCompoundDrawables(null,null,null,null); } /** * 设置右边文本 * @param text */ public void setRightText(String text) { righttext.setVisibility(VISIBLE); righttext.setText(text); //设置文本则不显示图片 righttext.setCompoundDrawables(null,null,null,null); } /** * 设置左侧图片 * @param id */ public void setLeftImg(int id) { Drawable drawable = getResources().getDrawable(id); drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); //设置图片则不显示文字 lefttext.setText(""); lefttext.setCompoundDrawables(drawable,null,null,null); } /** * 设置右侧图片 * @param id */ public void setRightIcon(int id) { Drawable drawable = getResources().getDrawable(id); drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); //设置图片则不显示文字 righttext.setText(""); 4000 righttext.setCompoundDrawables(null,null,drawable,null); }
关于响应点击事件,则使用接口和回调就可以解决.
private TextView lefttext; private TextView titletext; private TextView righttext; OnLeftTextClickListener leftlistener; OnRightTextClickListener rightlistener; //左侧文本回调接口 public interface OnLeftTextClickListener { void onLeftTextClick(); } /** * 设置左侧文本回调 * @param listener */ public void setOnLeftTextClickListener(OnLeftTextClickListener listener) { this.leftlistener = listener; } //右侧文本回调接口 public interface OnRightTextClickListener { void onRightTextClick(); } /** * 设置右侧文本回调 * @param litener */ public void setOnRightTextClickListener(OnRightTextClickListener litener) { this.rightlistener = litener; } ..... @Override protected void onFinishInflate() { super.onFinishInflate(); lefttext = (TextView) findViewById(R.id.toolbar_left); titletext = (TextView) findViewById(R.id.toolbar_title); righttext = (TextView) findViewById(R.id.toolbar_right); toolbar = (Toolbar) findViewById(R.id.toolbar_layout); lefttext.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { leftlistener.onLeftTextClick(); } }); righttext.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { rightlistener.onRightTextClick(); } }); }
使用自定义toolbar,以MainActivity为例,
首先将activity的theme设置为noactionbar,
在布局中直接加入.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.benhuan.mytoolbardemo.MainActivity"> <com.benhuan.mytoolbardemo.CustomToolbar android:id="@+id/ctoolbar_main" android:layout_width="match_parent" android:layout_height="wrap_content" /> </RelativeLayout>
可以看到效果了:
我们想要改变颜色
private void initToolbar() { customToolbar.setToolbarBackgroundColor(R.color.black); customToolbar.setToolbarTitle("标题一"); }
效果:
设置只需要标题
private void initToolbar2() { customToolbar.setToolbarBackgroundColor(R.color.green); customToolbar.setOnlyTitle(); customToolbar.setToolbarTitle("标题二"); }
效果:
设置点击事件
private void initToolbar3() { customToolbar.setToolbarBackgroundColor(R.color.red); customToolbar.setToolbarTitle("标题三"); customToolbar.setLeftText("返回"); customToolbar.setRightText("添加"); customToolbar.setOnLeftTextClickListener(new CustomToolbar.OnLeftTextClickListener() { @Override public void onLeftTextClick() { //响应左侧文本点击事件 } }); customToolbar.setOnRightTextClickListener(new CustomToolbar.OnRightTextClickListener() { @Override public void onRightTextClick() { //响应右侧文本点击事件 } }); }
效果:
将文本切换成图片
private void initToolbar4() { customToolbar.setToolbarBackgroundColor(R.color.colorToolbar); customToolbar.setToolbarTitle("标题四"); customToolbar.setLeftImg(R.drawable.arrow); customToolbar.setRightImg(R.drawable.add); }
效果:
可以看到,使用起来非常简单,以后遇到特殊情况可以继续进行扩展.
代码不多,直接贴出自定义view的源码.
package com.benhuan.mytoolbardemo; import android.content.Context; import android.graphics.drawable.Drawable; import android.support.v7.widget.Toolbar; import android.util.AttributeSet; import android.view.View; import android.widget.TextView; /** * Created by XieMinFeng. * Date: 2017-03-05 * Time: 10:14 * Desc: */ public class CustomToolbar extends Toolbar { private TextView lefttext; private TextView titletext; private TextView righttext; private Toolbar toolbar; OnLeftTextClickListener leftlistener; OnRightTextClickListener rightlistener; public CustomToolbar(Context context) { this(context, null); } public CustomToolbar(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CustomToolbar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); inflate(context, R.layout.view_customtoolbar,this); } @Override protected void onFinishInflate() { super.onFinishInflate(); lefttext = (TextView) findViewById(R.id.toolbar_left); titletext = (TextView) findViewById(R.id.toolbar_title); righttext = (TextView) findViewById(R.id.toolbar_right); toolbar = (Toolbar) findViewById(R.id.toolbar_layout); lefttext.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { leftlistener.onLeftTextClick(); } }); righttext.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { rightlistener.onRightTextClick(); } }); } public void setToolbarBackgroundColor(int color) { toolbar.setBackgroundResource(color); } /** * 设置只显示标题 */ public void setOnlyTitle() { lefttext.setVisibility(INVISIBLE); righttext.setVisibility(INVISIBLE); } /** * 设置右侧不显示 */ public void setNoRightText() { righttext.setVisibility(INVISIBLE); } /** * 设置标题 * @param text */ public void setToolbarTitle(String text) { this.setTitle(""); titletext.setVisibility(View.VISIBLE); titletext.setText(text); } /** * 设置左侧文本 * @param text */ public void setLeftText(String text) { lefttext.setVisibility(VISIBLE); lefttext.setText(text); //设置文本则不显示图片 lefttext.setCompoundDrawables(null,null,null,null); } /** * 设置右边文本 * @param text */ public void setRightText(String text) { righttext.setVisibility(VISIBLE); righttext.setText(text); //设置文本则不显示图片 righttext.setCompoundDrawables(null,null,null,null); } /** * 设置左侧图片 * @param id */ public void setLeftImg(int id) { Drawable drawable = getResources().getDrawable(id); drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); //设置图片则不显示文字 lefttext.setText(""); lefttext.setCompoundDrawables(drawable,null,null,null); } /** * 设置右侧图 ae37 片 * @param id */ public void setRightImg(int id) { Drawable drawable = getResources().getDrawable(id); drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); //设置图片则不显示文字 righttext.setText(""); righttext.setCompoundDrawables(null,null,drawable,null); } //左侧文本回调接口 public interface OnLeftTextClickListener { void onLeftTextClick(); } /** * 设置左侧文本回调 * @param listener */ public void setOnLeftTextClickListener(OnLeftTextClickListener listener) { this.leftlistener = listener; } //右侧文本回调接口 public interface OnRightTextClickListener { void onRightTextClick(); } /** * 设置右侧文本回调 * @param litener */ public void setOnRightTextClickListener(OnRightTextClickListener litener) { this.rightlistener = litener; } /** * 设置返回图片 * @param id 图片的id */ public void setbackIcon(int id) { this.setNavigationIcon(id); lefttext.setVisibility(GONE); //左侧文本不设置draw lefttext.setCompoundDrawables(null,null,null,null); this.setNavigationOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); } }
相关文章推荐
- 自定义 ToolBar 实现标题栏
- 自定义ScrollView实现Toolbar(标题栏)渐变
- 自定义 ToolBar 实现标题栏
- Android—自定义标题栏的实现及遇见的问题解决
- UWP中实现自定义标题栏
- 非常简洁的自定义dialog实现方式(带源码)
- Android高版本自定义标题栏实现
- 基于百度地图 Android SDKv1.3.5实现简单的定位功能,自定义标题栏
- 写出高效清晰Layout布局文件的一些技巧--------自定义CoordinatorLayout:实现淘宝和QQ ToolBar透明渐变效果-------自定义Coordi快速返回效果
- androi实现自定义标题栏、自定义光标
- qml实现自定义标题栏按钮
- Android 实现横向标题栏滚动效果(HorizontalScrollView + GridView + Viewpager + 自定义适配器)
- 自定义ToolBar的实现
- Android自定义标题栏的实现,及屏蔽系统标题栏
- 列表标题栏添加CheckBox(自定义HanderView的时候实现)
- Android实现自定义标题栏的方法
- 基于百度地图 Android SDKv1.3.5实现简单的定位功能,自定义标题栏
- 源代码分析之如何实现自定义的标题栏
- Winform自定义窗体样式,实现标题栏可灵活自定义
- 菜鸟初学android体验之——实现自定义简单标题栏的两种简单方法