• ToolBar的使用


    1. 去掉ActionBar:需要把windowActionBar,windowNoTitle以及加上android声明的也写上。确保把系统自带的以及第三方兼容包的ActionBar都彻底去掉。确保把系统自带的以及第三方兼容包的ActionBar都彻底去掉。

    <style name="AppTheme"  parent="Theme.AppCompat.Light.NoActionBar">
            <item name="colorPrimary">@color/red</item>
            <item name="colorPrimaryDark">@color/green</item>
            <item name="colorAccent">@color/blue</item>
            <item name="android:textColorPrimary">@color/white</item>
    
            <item name="android:windowActionBar">false</item>
            <item name="android:windowNoTitle">true</item>
    
            <item name="windowActionBar">false</item>
            <item name="windowNoTitle">true</item>
        </style>

    2. 主题中的几个颜色:

    • colorPrimary是指导航栏的颜色。
    • colorAccent是指我们常用控件比如Button等的颜色。
    • textColorPrimary是指我们导航栏中标题的颜色。
    • windowBackground是指我们窗体的默认颜色。
    • navigationBarColor是指Android手机中虚拟按键的背景颜色。

     

    3、代码中对Toolbar进行常见的操作,可以通过ID找到Toolbar之后,可以对导航图标进行点击监听,前提必须是在布局或者java代码中添加了导航图标,同理也可以使用菜单。

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    
    //对Toolbar左边的导航图标进行监听
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(MainActivity.this, "返回", Toast.LENGTH_SHORT).show();
        }
    });
    
    //Toolbar中使用菜单
    toolbar.inflateMenu(R.menu.menu_main);
    toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {
                case R.id.action_item1:
                    Toast.makeText(MainActivity.this, "菜单1", Toast.LENGTH_SHORT).show();
                    return true;
                case R.id.action_item2:
                    Toast.makeText(MainActivity.this, "菜单2", Toast.LENGTH_SHORT).show();
                    return true;
                case R.id.action_item3:
                    Toast.makeText(MainActivity.this, "菜单3", Toast.LENGTH_SHORT).show();
                    return true;
            }
            return false;
        }
    });

     

     

    自定义Toolbar

     

    • 自定义布局,添加到Toolbar中。
    •        有必要的时候自定义一些属性。
    •   自定义Class继承Toolbar,读取自定义属性,对Toolbar的布局显示,内容进行设置,最后需要对外公开一些函数用于设置标题,监听等、

    1.写一个自定义布局,用来放入自定义Toolbar。

    <?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="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:layout_marginRight="60dp"
            android:visibility="gone"/>
    
         <TextView
             android:id="@+id/toolbar_title"
             android:layout_centerInParent="true"
             android:layout_gravity="center"
             android:gravity="center"
             android:textColor="@color/white"
             android:textSize="20sp"
             android:visibility="gone"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"/>
    
        <ImageButton
            android:id="@+id/toolbar_rightButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerInParent="true"
            android:visibility="gone"
            style="@android:style/Widget.Material.Toolbar.Button.Navigation"/>
    
    </RelativeLayout>

    2.在values文件下新建attrs.xml文件,用于存放自定义的一些属性。

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <declare-styleable name="CnToolbar">
            
            <!--右边按钮-->
            <attr name="rightButtonIcon" format="reference"/>
            <!--用于是否显示搜索框-->
            <attr name="isShowSearchView" format="boolean"/>
    
        </declare-styleable>
    </resources>

    初始化界面的时候需要把自定义的属性的值通过TintTypedArray读取进来,然后进行一些界面显示方面的设置。

    初始化监听器,需要用到接口的回调,具体步骤是公开的声明接口,接口里面有OnClick方法,声明该接口的实现,作为Toolbar的私有成员变量,公开setListener方法,把传入的

    Listener实现类赋值给这个成员变量;在必须的时候调用成员变量的onClick方法(如在左边的按钮的点击事件中调用)。公开一些函数,比如设置标题,设置是否显示搜索框、标题等等。

      1 public class CnToolbar extends Toolbar {
      2 
      3     private LayoutInflater mInflater;
      4 
      5     private View mView;
      6 
      7     private TextView mTextTitle;
      8 
      9     private EditText mSearchView;
     10 
     11     private ImageButton mRightImageButton;
     12 
     13     public CnToolbar(Context context) {
     14         this(context,null);
     15     }
     16 
     17     public CnToolbar(Context context, @Nullable AttributeSet attrs) {
     18         this(context, attrs,0);
     19     }
     20 
     21     public CnToolbar(Context context, AttributeSet attrs, int defStyleAttr) {
     22         super(context, attrs, defStyleAttr);
     23 
     24         //初始化界面
     25         initView();
     26         //设置边距
     27         setContentInsetsRelative(50,10);
     28 
     29 
     30         if(attrs !=null) {
     31             //通过代码得到布局中的一些信息
     32             final TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs,
     33                     R.styleable.CnToolbar, defStyleAttr, 0);
     34 
     35             final Drawable rightIcon = a.getDrawable(R.styleable.CnToolbar_rightButtonIcon);
     36             if (rightIcon != null) {
     37                 //使右边按钮显示出来
     38                 setRightButtonIcon(rightIcon);
     39             }
     40 
     41             boolean isShowSearchView = a.getBoolean(R.styleable.CnToolbar_isShowSearchView,false);
     42 
     43             if(isShowSearchView){
     44                 showSearchView();
     45                 hideTitleView();
     46             }
     47 
     48             //TintTypedArray使用完毕进行回收
     49             a.recycle();
     50         }
     51 
     52     }
     53 
     54     private void initView(){
     55 
     56         if(mView == null){
     57             mInflater = LayoutInflater.from(getContext());
     58             mView = mInflater.inflate(R.layout.toolbar, null);
     59 
     60 
     61             mTextTitle = (TextView) mView.findViewById(R.id.toolbar_title);
     62             mSearchView = (EditText) mView.findViewById(R.id.toolbar_searchview);
     63             mRightImageButton = (ImageButton) mView.findViewById(R.id.toolbar_rightButton);
     64 
     65 
     66             LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL);
     67 
     68             //添加自定义的布局到Toolbar
     69             addView(mView, lp);
     70         }
     71 
     72     }
     73 
     74     //设置右边按钮
     75     public void  setRightButtonIcon(Drawable icon){
     76         if(mRightImageButton !=null){
     77             mRightImageButton.setImageDrawable(icon);
     78             mRightImageButton.setVisibility(VISIBLE);
     79         }
     80     }
     81 
     82     //用于设置点击监听事件
     83     public void setRightButtonOnClickListener(OnClickListener li){
     84         mRightImageButton.setOnClickListener(li);
     85     }
     86 
     87 
     88     //重写设置标题的方法
     89     @Override
     90     public void setTitle(int resId){
     91         setTitle(getContext().getText(resId));
     92     }
     93 
     94     @Override
     95     public void setTitle(CharSequence title){
     96         initView();
     97         if(mTextTitle !=null) {
     98             mTextTitle.setText(title);
     99             showTitleView();
    100         }
    101     }
    102     
    103     /*
    104     * 显示以及隐藏搜索框、标题的方法。
    105      */
    106     
    107     public  void showSearchView(){
    108         if(mSearchView !=null)
    109             mSearchView.setVisibility(VISIBLE);
    110     }
    111 
    112     public void hideSearchView(){
    113         if(mSearchView !=null)
    114             mSearchView.setVisibility(GONE);
    115     }
    116     
    117     public void showTitleView(){
    118         if(mTextTitle !=null)
    119             mTextTitle.setVisibility(VISIBLE);
    120     }
    121 
    122 
    123     public void hideTitleView() {
    124         if (mTextTitle != null)
    125             mTextTitle.setVisibility(GONE);
    126     }
    127 
    128 }
    View Code

    自定义Toolbar 

    如同一般的控件去使用就可以了,注意加上自定义属性的命名空间,一般为auto就可以了。


    ToolBar设置NavigationIcon不显示异常或自定义失败异常

  • 相关阅读:
    ruby 实现java中的aes 加密解密
    移动端手机端web页面中背景图固定问题
    hooks 组件对应的生命周期
    React 生命周期函数总结
    Sequelize 常用增删改查函数
    如何验证SSH的连通性
    如何生成SSH密钥
    如何查看本机ssh秘钥
    如何更改本地代码仓库指向
    如何发布npm 包
  • 原文地址:https://www.cnblogs.com/chase1/p/7260201.html
Copyright © 2020-2023  润新知