1.写toolbar的布局文件 ,toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="45dp"> <android.support.v7.widget.AppCompatEditText
android:id="@+id/toolbar_searchview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_centerVertical="true"
android:imeOptions="actionSearch"
android:singleLine="true"
style="@style/search_view"
android:drawablePadding="8dp"
android:visibility="gone"
/> <android.support.v7.widget.AppCompatTextView
android: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"
/> <android.support.v7.widget.AppCompatImageView
android:id="@+id/toolbar_rightImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:textColor="@color/white"
android:visibility="gone"
/>
</RelativeLayout>

2.新建一个toolbar类,继承原生toolbar

public class MyToolbar extends Toolbar {

    private LayoutInflater mInflater;

    private View mView;
private TextView mTextTitle;
private EditText mSearchView;
private ImageView mRightImageView;
private Drawable mEditTextSearchIcon; public MyToolbar(Context context) {
this(context,null);
} public MyToolbar(Context context, AttributeSet attrs) {
this(context, attrs, );
} public MyToolbar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr); initView(); setContentInsetsRelative(,); if(attrs!=null){
TypedArray a= context.obtainStyledAttributes(attrs,R.styleable.MyToolbar);
Drawable rightImageIcon = a.getDrawable(R.styleable.MyToolbar_rightImageIcon); //获得右边的图标
if(rightImageIcon!=null){
setRightButtonIcon(rightImageIcon);
}
//获得搜索的图标
Drawable searchIcon = a.getDrawable(R.styleable.MyToolbar_editTextSearchIcon);
if(searchIcon!=null){
searchIcon.setBounds(,,searchIcon.getIntrinsicWidth(), searchIcon.getIntrinsicHeight());
mSearchView.setCompoundDrawables(searchIcon,null,null,null);
} //获得搜索的hint
String hint = a.getString(R.styleable.MyToolbar_searchViewHint);
if(hint!=null){
mSearchView.setHint(hint);
} boolean isShowSearchView =a.getBoolean(R.styleable.MyToolbar_isShowSearchView,false);
if(isShowSearchView){
showSearchView();
hideTitleView();
}else{
hideSearchView();
showTitleView();
}
a.recycle();
} } private void setRightButtonIcon(Drawable drawable){
if(mRightImageView!=null){
mRightImageView.setImageDrawable(drawable);
mRightImageView.setVisibility(VISIBLE);
}
} public void setRightImageViewOnClickListener(OnClickListener listener){
mRightImageView.setOnClickListener(listener);
} private void initView() { if(mView == null) { mInflater = LayoutInflater.from(MyApplication.getContext());
mView = mInflater.inflate(R.layout.toolbar, null); mTextTitle = (TextView) mView.findViewById(R.id.toolbar_title);
mSearchView = (EditText) mView.findViewById(R.id.toolbar_searchview);
mRightImageView = (ImageView) mView.findViewById(R.id.toolbar_rightImage); LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL); addView(mView, lp);
} } @Override
public void setTitle(int resId) { setTitle(getContext().getText(resId));
} @Override
public 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);
}
}

3设置需要自定义的属性,在values下新建attrs.xml文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyToolbar">
<attr name="rightImageIcon" format="reference"/>
<attr name="editTextSearchIcon" format="reference"/>
<attr name="isShowSearchView" format="boolean"/>
<attr name="searchViewHint" format="string"/>
</declare-styleable>
</resources>

4.搜索框的样式文件 在values->styles.xml

 <style name="search_view">
<item name="android:textSize">18sp</item>
<item name="android:textColor">@color/white</item>
<item name="android:textColorHint">@color/white</item> <item name="android:background">@drawable/selector_search_view</item>
<item name="android:paddingTop">6dp</item>
<item name="android:paddingBottom">6dp</item>
<item name="android:paddingLeft">4dp</item>
<item name="android:singleLine">true</item>
</style>

5.样式中有个自己绘制的图片

<?xml version="1.0" encoding="utf-8"?>

    <selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" >
<shape android:shape="rectangle">
<corners android:radius="8dp" />
<solid android:color="#eb4f38" />
</shape>
</item>
<item android:state_pressed="true">
<shape android:shape="rectangle">
<corners android:radius="8dp" />
<solid android:color="#eb4f38" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<corners android:radius="8dp" />
<solid android:color="#D82917" />
</shape>
</item>
</selector>

6.在布局中正式调用例子

<com.lingdangmao.myapplication.MyToolbar
android:id="@+id/mytoolbar"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:isShowSearchView="true"
app:editTextSearchIcon="@mipmap/icon_search"
app:searchViewHint="请输入提示内容啊"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:layout_width="match_parent"
android:layout_height="wrap_content"> </com.lingdangmao.myapplication.MyToolbar>
<com.lingdangmao.myapplication.MyToolbar
android:id="@+id/mytoolbar"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:isShowSearchView="false"
app:title="asdasdad"
app:navigationIcon="@drawable/icon_back_32px"
app:rightImageIcon="@drawable/icon_back_32px"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:layout_width="match_parent"
android:layout_height="wrap_content"> </com.lingdangmao.myapplication.MyToolbar>

实际效果  2种样式,通过参数不同进行配置

自定义toolbar教程的更多相关文章

  1. Android自定义视图教程

    Android自定义视图教程 Android的UI元素都是基于View(屏幕中单个元素)和ViewGroup(元素的集合),Android有许多自带的组件和布局,比如Button.TextView.R ...

  2. 如何解决自定义ToolBar起始位置的空格(左对齐)问题

    最近在做项目的时候,与到自定义toolbar的问题,自定义toolbar布局之类的并不是很难,但是自定义布局完成之后,控件总是无法左对齐,这极大的影响了App的美观. 结果谷歌后在Stack Over ...

  3. 商城项目实战 | 2.2 Android 仿京东商城——自定义 Toolbar (二)

    本文为菜鸟窝作者刘婷的连载."商城项目实战"系列来聊聊仿"京东淘宝的购物商城"如何实现. 上一篇文章<商城项目实战 | 2.1 Android 仿京东商城 ...

  4. 自定义ToolBar

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

  5. 去除自定义Toolbar中左边距

    问题 自定义Toolbar之后,发现左侧不能完全填充,总是留一点空白,如下图: 原因 查看Wiget.AppCompat.Toolbar的parent(Toolbar默认的style),如下: < ...

  6. ToolBar教程:AppCompatActivity下用toolbar当actionbar用

    参考: https://developer.android.com/training/appbar/index.html 1,自定义toolbar主题 2,在布局xml中使用toolbar 3,在代码 ...

  7. spring cloud 2.x版本 Gateway自定义过滤器教程

    前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka ...

  8. Android 自定义ToolBar详细使用

    自定义xml设置ToolBar,通过menu文件扩展选项,通过继承baseactivity使用 1.ToolBar布局 <?xml version="1.0" encodin ...

  9. 自定义ToolBar之一

    其实已经有很多大神写过这方面的文章了,不过我比较蠢吧,老有一些地方看不懂的,翻了很多关于Toolbar方面的文章和视频,这儿总结一下.  参考资料:youtube:slidenerd 阶段一 自定义配 ...

随机推荐

  1. Unicode控制字符

    Unicode控制字符就是特殊的Unicode字符 控制字符转义代码对照表 Unicode-控制字符 ‎LRM ‏RLM ‍ZWJ ‌ZWNJ ‪LRE ‭LRO ‮RLO ‬PDF NADS  ...

  2. python2.7入门---file(文件)&OS 文件&目录方法

        首先file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数: 序号 方法及描述 1 file.close() 关闭文件.关闭后文件不能再进行读写操作. 2 file.f ...

  3. Linux 之vi与vim

    vi 三种模式: 『一般模式』: 光标 『编辑模式』:i,o,a,r 『指令列命令模式』「:/ ?」 例子: 1. 请在/tmp 这个目录下建立一个名为vitest 的目录: 2. 将/etc/man ...

  4. 谷歌面试官经典作品(CTCI)目录

    1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1.8 利用已知函数判断字符串是否为另一字符串的子串 2.1 从链表中移除重复结点 2.2 实现一个算法从一个 ...

  5. struts2官方 中文教程 系列九:Debugging Struts

    介绍 在Struts 2 web应用程序的开发过程中,您可能希望查看由Struts 2框架管理的信息.本教程将介绍两种工具,您可以使用它们来查看.一个工具是Struts 2的配置插件,另一个是调试拦截 ...

  6. P1823 音乐会的等待(单调栈)

    P1823 音乐会的等待 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么 ...

  7. LeetCode:26. Remove Duplicates from Sorted Array(Easy)

    1. 原题链接 https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/ 2. 题目要求 给定一个已 ...

  8. centos7下安装elasticSearch错误总结(单节点模式)

    1.首先确定你安装了jdk,版本需要1.8以上 2.上传elasticsearchjar包,只需配置一个文件即可 修改配置文件config/elasticsearch.yml    network.h ...

  9. 封装一个List集合和datatable相互转换的工具类(可对指定列进行重命名并且指定输出列)

    /// <summary> /// List转换为DataTable对象 /// </summary> public class ListTranTableModel { // ...

  10. 判断电脑CPU硬件支不支持64位

    你可以在注册表中查看: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment\PROCESSO ...