效果图:上面
实现步骤:
1.首先定义一个toolbar的layout布局,这个布局中含有editText 和TextView,Button,对应上面的效果图
2.
<?xml version="1.0" encoding="utf-8"?>
<!--这个布局是toolbar的子布局-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android: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"></EditText>
<TextView
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"
/>
<Button
android:id="@+id/toolbar_rightButton"
android:layout_width="20sp"
android:layout_height="20sp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:textColor="@color/white"
android:visibility="gone"
style="@android:style/Widget.Material.Toolbar.Button.Navigation"
/>
</RelativeLayout>
editText的样式文件:
1.style中的文件
<!--editText的样式-->
<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>
2.drabable中的selector_search_view文件:
<?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>
2.在widget中新建ByToolBar文件,它就死自定义的ToolBar只不过是以类的形式,显示出来,代码后面上
3.在你需要显示这个toolbar的布局里面加上ByToolBar这个类,与此同时你先要在values中新建一个attrs的文件夹,在里面自定义几个需要使用的属性
attrs的代码;
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ByToolBar">
<attr name="rightButtonIcon" format="reference"/>
<attr name="isShowSearchView" format="boolean"/>
</declare-styleable>
</resources>
<!--format="refreence"这个是来规定取值范围-->
<!--refrence这个是为了可以调用自定义的button的图片-->
<!--boolran这个是为了空时editText和TextView,button的可见性切换-->
layout布局:
<!--backgrounf在style中修改背景颜色,minheight是最小高度-->
<!-- app:title=""这个设置toolbar上的textview的文字, app:navigationIcon="@mipmap/icon_back_32px"这个是设置最左边的图案,可以不自定义-->
<!-- - app:rightButtonIcon="@mipmap/icon_back_32px"
app:isShowSearchView="true"
这两个就是在ByToolBar中自定义的设置控件的可见性切换,和右边button的可见性->
<zuo.com.ui.widget.ByToolBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:title="@string/home"
app:rightButtonIcon="@mipmap/icon_back_32px"
app:navigationIcon="@mipmap/icon_back_32px"
app:isShowSearchView="true"
>
最后是ByToolBar的代码:
package zuo.com.ui.widget;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v7.widget.TintTypedArray;
import android.support.v7.widget.Toolbar;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import zuo.com.ui.R;
/**
* Created by Administrator on 2016/10/7.
*/
public class ByToolBar extends Toolbar {
private LayoutInflater layoutInflater;
private TextView mTextTitle;
private EditText mSearchView;
private Button mRightButton;
public ByToolBar(Context context) {
this(context,null);
}
public ByToolBar(Context context, @Nullable AttributeSet attrs) {
this(context,attrs,0);
}
//第三个构造函数,调用第二个构造函数,第二个构造函数调用第一个构造函数
public ByToolBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
//设置editText的左右边距
setContentInsetsRelative(10,10);
//这个实际上就是复制自定义的button的图案
if (attrs != null) {
final TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs,
R.styleable.ByToolBar, defStyleAttr, 0);
final Drawable rightIcon = a.getDrawable(R.styleable.ByToolBar_rightButtonIcon);
if (rightIcon != null) {
//setNavigationIcon(navIcon);
setRightButtonIcon(rightIcon);
}
/**
* 这个是设置editText控件,他不能与textview和button同时出现,所以出现了就要调用下面的方法,设置textview的可见性
*/
boolean isShowSearchView = a.getBoolean(R.styleable.ByToolBar_isShowSearchView,false);
if(isShowSearchView){
showSearchView();
hideTitleView();
hideRightButton();
//设置最左边控件的可见性 setNavigationIcon(null);
}
a.recycle();//关闭a
}
}
/**
*设置右边button 的值
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public void setRightButtonIcon(Drawable icon){
if(mRightButton !=null){
mRightButton.setBackground(icon);
mRightButton.setVisibility(VISIBLE);
}
}
/**
*右边button的点击事件
*/
public void setRightButtonOnClickListener(OnClickListener li){
mRightButton.setOnClickListener(li);
}
/**
* 这个函数实际上就是初始化tool_bar中三个控件的实例对象,然后将他们放在一个LinearLayout不居中,实现ToolBar的布局
*/
private void initView() {
if(mTextTitle==null) {
layoutInflater = LayoutInflater.from(getContext());
View view = layoutInflater.inflate(R.layout.tool_bar, null);
mTextTitle = (TextView) view.findViewById(R.id.toolbar_title);
mSearchView = (EditText) view.findViewById(R.id.toolbar_searchview);
mRightButton = (Button) view.findViewById(R.id.toolbar_rightButton);
LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL);
addView(view, lp);
}
}
/**
*下面的几个getset函数实际上就是设置tool_bar中三个控件的可见性
*/
@Override
public void setTitle(@StringRes int resId) {
super.setTitle(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);
}
public void hideRightButton(){
if(mRightButton!=null){
mRightButton.setVisibility(GONE);
}
}
}