自定义ToolBar的使用

源码地址:https://github.com/Bacsonlx/Android-CNiaoShop/tree/master/CNiaoShop_02

代码中:MainActivity演示的是自定义ToolBar的使用,TestActivity演示的是原生ToolBar的使用。

演示效果:

一、原生ToolBar

1. 什么是ToolBar

Toolbar 是 android 5.0 引入的一个新控件,Toolbar出现之前,我们很多时候都是使用ActionBar以及ActionActivity实现顶部导航栏的,因此Toolbar可以理解为是ActionBar的升级版。Toolbar大大扩展了ActionBar,使用更灵活,不像ActionBar那么固定,Toolbar更像是一般的View元素,可以被放置在view树体系的任意位置,可以应用动画,可以跟着scrollView滚动,可以与布局中的其他view交互。

2. 使用ToolBar

在我们需要顶部导航栏的布局文件当中添加Toolbar,并且配置一些常用的属性(使用自定义属性的时候需要注意把命名空间“app”添加到根节点)


这里只列出一些常用的属性,比如最小高度,返回按钮的图标,背景等等。这里需要注意的是,属性值中的“?”表示对Android系统的主题样式进行重用。意思是如果我们改变了主题样式中的colorPrimary属性的话,Toolbar的背景颜色也会随之改变,因此提醒我们去主题样式中进行一些配置。

xmlns:app="http://schemas.android.com/apk/res-auto"<android.support.v7.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="?attr/colorPrimary"android:minHeight="?actionBarSize"app:navigationIcon="@mipmap/arrow_left"app:title="标题"/>

**拓展:**Android主题颜色的详解

  • colorPrimaryDark是我们手机最顶端的状态栏的背景颜色(改变它需要Android5.0以及以上的手机支持才行)。
  • colorPrimary是指导航栏的颜色。
  • colorAccent是指我们常用控件比如Button等的颜色。
  • textColorPrimary是指我们导航栏中标题的颜色。
  • windowBackground是指我们窗体的默认颜色。
  • navigationBarColor是指Android手机中虚拟按键的背景颜色。

3. 去除ActionBar:

styles.xml文件中进行一些常用的配置。由于我们使用的是AppCompatActivity,因此必须使用AppCompat的相关主题,笔者这里使用亮色调的没有ActionBar的主题,注意需要在清单文件当中去使用自己定义的主题。为了完全去掉ActionBar,需要把windowActionBarwindowNoTitle以及加上android声明的也写上,确保把系统自带的以及第三方兼容包的ActionBar都彻底去掉。

    <!-- Base application theme. --><style name="AppTheme" parent="Theme.AppCompat"><!-- Customize your theme here. --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="android:textColorPrimary">@color/white</item><!-- 窗口的背景颜色 --><item name="android:windowBackground">@android:color/white</item><!--隐藏ActionBar--><item name="android:windowActionBar">false</item><item name="android:windowNoTitle">true</item><item name="windowActionBar">false</item><item name="windowNoTitle">true</item></style>

二、 自定义ToolBar

通过下面的对比可以知道,原生的Toolbar画面太美不忍直视,一般来说要在项目当中使用Toolbar我们都应该去自定义Toolbar。下面开始讨论如何去自定义Toolbar。

核心的要点:

  • 自定义布局,添加到Toolbar当中
  • 有必要的时候自定义一些属性
  • 自定义Class继承Toolbar,读取自定义属性,对Toolbar的布局显示,内容进行设置,最后需要对外公开一些函数用于设置标题、监听等。

toolbar.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"><EditTextandroid:id="@+id/toolbar_searchview"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_centerVertical="true"android:gravity="center"android:drawableLeft="@mipmap/icon_search"style="@style/search_view"android:hint="请输入搜索内容"android:visibility="gone"/><TextViewandroid:id="@+id/toolbar_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:layout_gravity="center"android:gravity="center"android:textColor="@color/white"android:textSize="20sp"android:visibility="gone"/><ImageButtonandroid:id="@+id/toolbar_rightButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:visibility="gone"style="@android:style/Widget.Material.Toolbar.Button.Navigation"/></RelativeLayout>

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#fff"><!-- 自定义ToolBar --><widget.CnToolbarandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:background="?attr/colorPrimary"android:minHeight="?attr/actionBarSize"android:navigationIcon="@drawable/icon_back_32px"app:isShowSearchView="true"android:title="@string/title"></widget.CnToolbar>
</LinearLayout>

自定义属性

<resources><!--    自定义属性--><declare-styleable name="CnToolbar"><attr name="rightButtonIcon" format="reference"/><attr name="isShowSearchView" format="boolean"/></declare-styleable>
</resources>

CnToolbar.java

/***  自定义ToolBar: 通过重写ToolBar构造方法*/
public class CnToolbar extends Toolbar {private LayoutInflater mInflater;private View mView;private TextView mTextTitle;private EditText mSearchView;private ImageButton mRightImageButton;public CnToolbar(Context context) {this(context, null);}public CnToolbar(Context context, AttributeSet attrs) {this(context, attrs, 0);}@SuppressLint("RestrictedApi")public CnToolbar(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView();setContentInsetsRelative(10, 10);if (attrs != null) {// 定义自定义属性final TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs,R.styleable.CnToolbar, defStyleAttr, 0);final Drawable rightIcon = a.getDrawable(R.styleable.CnToolbar_rightButtonIcon);// 根据属性是否有赋值来判断是否需要设置右边的按钮if (rightIcon != null) {//setNavigationIcon(navIcon);// 设置右边的按钮图标setRightButtonIcon(rightIcon);}// 根据属性是否为true来判断是否需要设置搜索框boolean isShowSearchView = a.getBoolean(R.styleable.CnToolbar_isShowSearchView, false);if (isShowSearchView) {// 显示搜索框和隐藏标题showSearchView();hideTitleView();}a.recycle();}}private void initView() {if(mView == null) {// 找到toolbar的布局文件mInflater = LayoutInflater.from(getContext());mView = mInflater.inflate(R.layout.toolbar, null);mTextTitle = (TextView) mView.findViewById(R.id.toolbar_title);mSearchView = (EditText) mView.findViewById(R.id.toolbar_searchview);mRightImageButton = (ImageButton) mView.findViewById(R.id.toolbar_rightButton);// 定义Layout的布局 三个参数:宽、高、对齐方式LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL);// 把自定义控件放入toolbar中addView(mView, lp);}}// 重写ToolBar的setTitle方法使得标题能够居中@Overridepublic void setTitle(int resId) {setTitle(getContext().getText(resId));}@Overridepublic void setTitle(CharSequence title) {initView();if (mTextTitle != null) {mTextTitle.setText(title);// 将隐藏的标题显示出来showTitleView();}}// 显示搜索框public  void showSearchView(){if(mSearchView !=null)mSearchView.setVisibility(VISIBLE);}// 隐藏搜索框public void hideSearchView(){if(mSearchView !=null)mSearchView.setVisibility(GONE);}// 显示标题public void showTitleView(){if(mTextTitle !=null)mTextTitle.setVisibility(VISIBLE);}// 隐藏标题public void hideTitleView() {if (mTextTitle != null)mTextTitle.setVisibility(GONE);}// 设置右边按钮图标public void  setRightButtonIcon(Drawable icon){if(mRightImageButton !=null){mRightImageButton.setImageDrawable(icon);mRightImageButton.setVisibility(VISIBLE);}}// 右边按钮点击事件public  void setRightButtonOnClickListener(OnClickListener li){mRightImageButton.setOnClickListener(li);}
}

自定义ToolBar的使用相关推荐

  1. android 自定义actionbar前面有一块空白,解决Android V7后自定义Toolbar、ActionBar左侧有空白问题...

    如图所示: 1.查看Wiget.AppCompat.Toolbar的parent主题,如下所示: @style/TextAppearance.Widget.AppCompat.Toolbar.Titl ...

  2. 自定义ToolBar

    一.Toolbar的简介 Toolbar 是 android 5.0 引入的一个新控件,Toolbar出现之前,我们很多时候都是使用ActionBar以及ActionActivity实现顶部导航栏的, ...

  3. ABAP ALV OO 自定义Toolbar 和Command及listmenu按钮

    ALV OO 自定义Toolbar 和Command及listmenu按钮 前言 OOALV容器 OOALV 工具栏 1.定义OO 对象及字段 2.OO ALV FIELDCAT 字段定义 3.定义类 ...

  4. Android自定义Toolbar以及设置圆形导航图标

    我们希望可以自定义Toolbar,实现一些特定的功能,android.support.v7.widget.Toolbar正好完成这些工作 首先看一下我们预期的效果图: 先看一下Toolbar的布局 & ...

  5. android toolbar 自定义,Android自定义Toolbar使用方法详解

    本篇文章介绍: 如何使用Toolbar; 自定义Toolbar; 先来看一看效果,了解一下toolbar: 布局文件: android:id="@+id/toolbar" andr ...

  6. android toolbar 自定义,自定义Toolbar,解决你所有的适配苦恼!

    About Toolbar Toolbar是一个官方ToolBar的扩展工具类,省去了对不同版本适配的复杂方案,它可以帮助你轻松实现NavigationBar和StatusBar的样式管理,最最重要的 ...

  7. 自定义Toolbar的一些小技巧

    目录 1.改变Toolbar高度(解决图标不垂直居中) 2.改变toolbar弹窗菜单样式 3.改变toolbar整体样式 4.改变searchview样式 1.改变Toolbar高度(解决图标不垂直 ...

  8. 关于CKEditor4.5.6的使用,自定义toolbar配置,上传图片案例(SpringMVC+MyBatis案例),自定义行高,去编辑器的中内容,将编辑器中内容设置到指定的位置等

     关于CKEditor的一个配置整理,改文件为config.js: 文件内容如下: /**  * @license Copyright (c) 2003-2016, CKSource - Fred ...

  9. EasyUI——Dialog自定义Toolbar和buttons

    这里并没有使用js来渲染easyUI组件,通过HTML来实现. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...

最新文章

  1. 005,使用Java客户端连接RabbitMQ,构造我们的第一个Publish和Consumer应用
  2. 杭电1254java实现(双bfs 优先队列)
  3. axure 小程序 lib_详细揭秘微信小程序框架技术——Mpx
  4. J2SE综合对java util的总结 一
  5. ArrayList和LinkedList 的区别
  6. mysql 5.5免安装配置_mysql的参考文档mysql5.5.21免安装版的配置方法
  7. spark学习 Java版SparkSQL程序读取Hbase表注册成表SQL查询
  8. ResourceBundle和Properties(转载)
  9. 【转】各种字符串算法大总结
  10. html下载文件和上传文件(图片)(java后台(HttpServlet))打开保存路径和选择文件录取+(乱码UTF-8)+包...
  11. python response[200_python说httpresponse代码是200,但服务器说是301
  12. Android安装软件的后缀,apk是什么文件,后缀是apk是什么文件
  13. 许晓斌_Maven实战(五)——自动化Web应用集成测试
  14. Wireshark 设置中文
  15. 一致性算法之Raft算法
  16. 微信小程序实现列表项左滑删除效果
  17. 【文献翻译】基于SCAP的配置分析用于全面的合规性检查
  18. 【金山文档】 2021级2021-2022学年第二学期大学物理实验考试表格-软件2112https://kdocs.cn/l/cmrTqjJ1ogsN
  19. CEF:JavaScript 调用 C++ 函数 Demo(VS2013)
  20. 信息学奥赛一本通 1244:和为给定数 通过

热门文章

  1. EventArgs 解释
  2. 数据库-----数据库操作。
  3. 用户没有sudo权限解决方法
  4. PullScrollView详解(四)——完全使用listview实现下拉回弹(方法一)
  5. 【FMCW 03】测速
  6. Spring Cloud-Feign设计原理
  7. 查看linux内核源代码
  8. PHP网页ddos攻击,PHP拦截网站DDOS攻击防御代码
  9. 二分查找(python实现)
  10. tabulate结合loguru打印出美观又方便查找的日志记录!