• 自定义toolbar教程


    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, 0);
        }
    
        public MyToolbar(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
    
    
            initView();
    
            setContentInsetsRelative(20,20);
    
            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(0,0,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种样式,通过参数不同进行配置

  • 相关阅读:
    Keil MDK中的Code, RO-data , RW-data, ZI-data分别代表什么意思?(转)
    nrf开发笔记一开发软件
    ARM CORTEX-M3的时钟
    stm32之Cortex系统定时器(SysTick)
    micrium ucprobe使用笔记
    C语言结构体初始化的四种方法(转载)
    setsockopt的作用
    Java之RandomAccessFile小结
    疯狂JAVA讲义---第十五章:输入输出(上)流的处理和文件
    java压缩解压zip文件,中文乱码还需要ant.jar包
  • 原文地址:https://www.cnblogs.com/norm/p/8259474.html
Copyright © 2020-2023  润新知