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. stm32f103 time2配置,转载

    //----------------------------main()-------------------- //stm32f103c8t6有3个普通1个高级定时器 //每次进入中断服务程序间隔时 ...

  2. React 省市区三级联动

    省市区所对应的数据来自:http://www.zgguan.com/zsfx/jsjc/6541.html react中的代码是: export default class AddReceive ex ...

  3. Scala Tuple

    Python中的Tuple 元组将多样的对象集合到一起,元素不能修改,通过索引进行查找, 使用括号"()" 允许重复 Scala中的Tuple 概念跟Python是完全相同的 定义 ...

  4. WPF中的数据模板(DataTemplate)

    原文:WPF中的数据模板(DataTemplate) WPF中的数据模板(DataTemplate)                                                   ...

  5. P1991 无线通讯网

    P1991 无线通讯网 题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫 ...

  6. 雷哥带你走进Javascript

    javascript复习笔记--------------------------------------------1.概念2.面向对象思想3.作用认识4.引入方式5.执行顺序 变量 1)声明方式 x ...

  7. python基础——元组、文件及其它

    Python核心数据类型--元组 元组对象(tuple)是序列,它具有不可改变性,和字符串类似.从语法上讲,它们便在圆括号中,它们支持任意类型.任意嵌套及常见的序列操作. 任意对象的有序集合:与字符串 ...

  8. 【多线程】 Task ,async ,await

    [多线程]Task ,async ,await 一. WinForm 里经常会用到多线程, 多线程的好出就不多说了,来说说多线程比较麻烦的地方 1. UI 线程与其他线程的同步,主要是 Form 和 ...

  9. CSS流布局权威指南

    http://www.cnblogs.com/qieguo/p/5421252.html

  10. Borland和Micorsoft的对话(转载自月光软件网)

      Borland与Microsoft关于Delphi的对话 Bear 1.Delphi较贵  一套Delphi的价格大约相当于两套Visual Studio  ------------------- ...