自定义toolbar

来源:互联网 发布:sql server 按天分组 编辑:程序博客网 时间:2024/04/19 22:09
 ---
layout: post
title: 自定义toolbar
category: 代码
tags: android 控件
keywords: 
description: 
---
##程序功能
下面先来两张程序运行的图片。
程序主要实现的功能就是通过点击开关组件来切换toolbar样式。
运用了自定义toolbar。


##代码
###`mainactivity.java`代码
    package com.example.whoami.myapplication;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.Toolbar;
    import android.view.View;
    import android.widget.CompoundButton;
    import android.widget.Toast;
    import android.widget.ToggleButton;
    
    public class MainActivity extends AppCompatActivity {
        MyToolBar toolbar;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            toolbar = (MyToolBar) findViewById(R.id.toolbar);
            ToggleButton toggleButton = (ToggleButton) this.findViewById(R.id.toggleButton);
            toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                //通过开关的值来控制toolbar的样式
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                    if(b){
                        setStyle1();
                    }else{
                        setStyle2();
                    }
                }
            });
    
        }
        //样式一(界面像是一个搜索输入框,带一个放大镜图标)
        public void setStyle1(){
            toolbar.setTitleHiddent();
            toolbar.setSearchShow();
    
        }
        //样式二(界面显示一个返回图标,一个标题,改标题通过xml设置,还有一个+号图标
        public void setStyle2(){
            toolbar.setSerchHiddent();
            toolbar.setTitleShow();
        }
    }
###主界面对于的布局`activity_main.xml`
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        >
    
        <com.example.whoami.myapplication.MyToolBar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:minHeight="?attr/actionBarSize"
            android:background="@color/colorAccent"
            android:id="@+id/toolbar"
            app:title="主页"
            app:isTitleShow="false"
            app:rightButtonIcon="@android:drawable/ic_menu_add"
    
            >
    
        </com.example.whoami.myapplication.MyToolBar>
    
        <ToggleButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New ToggleButton"
            android:id="@+id/toggleButton"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="185dp" />
    </RelativeLayout>

###MyToolbar.java
新建一个类`MyToolbar.java`,继承toolbar。代码如下
    package com.example.whoami.myapplication;
    
    import android.content.Context;
    import android.graphics.drawable.Drawable;
    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.ImageButton;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MyToolBar extends Toolbar{
        //布局解析器
        private LayoutInflater inflater;
    
        EditText mSearchView;
        TextView mTitle;
        Button mRightButton;
    
        View mview;
    
    
        public MyToolBar(Context context, AttributeSet attrs) {
            super(context, attrs);
    
            initView();
            setContentInsetsRelative(10,10);//设置toolbar里面组件的边距,一个重要的属性,注意。
    
            //自定义属性,在varles文件夹里面新建一个attrs.xml
            //使用该文件里面的属性来给我们自定义控件赋值
    
    
            //读取attrs.xml文件的MyToolBar节点
            final TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs,
                    R.styleable.MyToolBar, 0, 0);
            //读取清单文件app:rightButtonIcon属性,并赋值给我们+号图片赋值
            final Drawable navIcon = a.getDrawable(R.styleable.MyToolBar_rightButtonIcon);
    
            //读取app:isTitleShow属性,设置初始界面显示的主题(有两个主题)
            final Boolean isTitleShow = a.getBoolean(R.styleable.MyToolBar_isTitleShow,false);
    
            //设置主题(所以可以通过isTitleShow来设置初始主题,也可以通过开关的空间切换主题
            setStyle(isTitleShow);
    
            Toast.makeText(getContext(), "navIcon="+navIcon, Toast.LENGTH_SHORT).show();
            setmRightButtonIcon(navIcon);
            a.recycle();
        }
    
        private void setStyle(Boolean isTitleShow) {
            if(isTitleShow){
                setTitleShow();
                setSerchHiddent();
    
            }else{
                setTitleHiddent();
                setSearchShow();
    
            }
        }
    
    
        private void initView() {
    
                if(mview ==null) {
                    inflater = LayoutInflater.from(getContext());
                    mview = inflater.inflate(R.layout.toolbar, null);
                    mSearchView= (EditText) mview.findViewById(R.id.toolbar_searchview);
                    mTitle = (TextView) mview.findViewById(R.id.toolbar_title);
                    mRightButton = (Button) mview.findViewById(R.id.toolbar_rightButton);
                    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 (mTitle != null){
                mTitle.setText(title);
            }
        }
        public  void setmRightButtonIcon(Drawable icon){
            if(mRightButton!= null){
                
                mRightButton.setBackground(icon);
            }
        }
        public void setSearchShow(){
            mSearchView.setVisibility(VISIBLE);
            setNavigationIcon(null);
        }
        public void setTitleHiddent(){
            mTitle.setVisibility(GONE);
            mRightButton.setVisibility(GONE);
        }
    
        public void setSerchHiddent(){
            mSearchView.setVisibility(GONE);
            setNavigationIcon(android.R.drawable.ic_media_rew);
        }
        public void setTitleShow(){
            mTitle.setVisibility(VISIBLE);
            mRightButton.setVisibility(VISIBLE);
        }
    
    }
###value文件夹里面的`styles.xml`代码如下
    <resources>
    
        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorAccent</item>
            <item name="colorAccent">@color/colorAccent</item>
            <item name="android:textColorPrimary">@color/yellow</item>
    
        </style>
    
    
        <color name="yellow">#ffffff</color>
    </resources>
###源代码下载百度云下载
[地址一](http://pan.baidu.com/s/1skJRgVr)

[地址二](http://pan.baidu.com/s/1c18MrUK),提取码:632s

其他地址:http://xiejingxun.com/2016/06/05/android-mytoolbar.html



0 0