ToolBar 笔记

1. Toolbar的使用方法:

  • 确保添加了appcompat-v7依赖

implementation 'com.android.support:appcompat-v7:26.1.0'

  • 确保Activity继承AppCompatActivity
    public abstract class BaseActivity extends AppCompatActivity {
            //...
    }
  • 在manifest.xml文件中把主题设置为NoActionBar
    在style.xml中设置NoActionBar
<style name="TestAPPTheme" parent="Theme.AppCompat.Light.NoActionBar">
     <item name="windowActionBar">false</item>
     <item name="windowNoTitle">true</item>
     <item name="android:windowIsTranslucent">true</item>
</style>

在manifex.xml中引用TestAPPTheme

 <application
      android:allowBackup="true"
       android:icon="@mipmap/ic_launcher"
       android:label="@string/app_name"
       android:roundIcon="@mipmap/ic_launcher_round"
       android:supportsRtl="true"
       android:theme="@style/TestAPPTheme">
</application
  • 在布局文件中引入ToolBar
<android.support.v7.widget.Toolbar
     android:id="@+id/toolbar"
     android:elevation="4dp"
     android:layout_width="match_parent"
     android:layout_height="?attr/actionBarSize"/>
  • 在 Activity 的 onCreate() 方法中,调用 Activity 的 setSupportActionBar() 方法,然后传递 Activity 的工具栏。该方法会将工具栏设置为 Activity 的应用栏
  mToolbar=findViewById(R.id.toolbar);
  setSupportActionBar(mToolbar);

调用getSupportActionBar()方法,可以得到ActionBar对象,并对其进行操作

ActionBar actionBar=getSupportActionBar();
//显示返回上一级按钮,就是Actionbar左侧的左箭头图标
actionBar.setDisplayHomeAsUpEnabled(true);

可以调用Toolbar的setTitle(),setNavigationIcon()等方法,设置Toolbar 的显示信息

 mToolbar.setTitle("");
 mToolbar.setNavigationIcon();
 mToolbar.setNavigationOnClickListener

2. 为Toolbar添加菜单

通过在res文件夹下创建menu菜单的方式添加。

  • 在res文件夹下创建menu文件夹,并在menu文件夹下创建menu菜单
    /res/menu/menu_toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        app:showAsAction="ifRoom|collapseActionView"
        android:id="@+id/one"
        android:title="one"
        app:actionLayout="@layout/toolbar_search"
        android:icon="@android:drawable/ic_menu_search" />
    <item
        app:showAsAction="ifRoom"
        android:id="@+id/two"
        android:title="two"
        android:icon="@android:drawable/ic_media_ff" />
    <item
        app:showAsAction="ifRoom"
        android:id="@+id/three"
        android:title="three"
        android:icon="@android:drawable/ic_media_next" />
    <item
        app:showAsAction="ifRoom"
        android:id="@+id/four"
        android:title="four"
        android:icon="@android:drawable/ic_menu_add" />
    <item
        app:showAsAction="ifRoom"
        android:id="@+id/five"
        android:title="five"
        android:icon="@android:drawable/ic_media_ff" />
    <item
        app:showAsAction="ifRoom"
        android:id="@+id/six"
        android:title="six"
        android:icon="@android:drawable/ic_media_next" />
</menu>

注意showAsAction的命名空间是app:而不是android:..,该属性有几个属性值可选:

  • ifRoom:表示如果有足够空间就显示在Toolbar上
  • never:表示显示在溢出菜单上
  • collapseActionView:在设置actionLayout的时候使用,表示折叠actionLayout的布局

这就创建好了菜单,如果要在Activity中显示的话,还需要在 Activity的onCreateOptionMenu()方法中inflate该布局


 @Override
  public boolean onCreateOptionsMenu(Menu menu) {
      //调用getMenuInflater(),加载菜单文件
      getMenuInflater().inflate(R.menu.menu_toolbar,menu);

      MenuItem menuItem=menu.findItem(R.id.one);
      menuItem.setOnActionExpandListener(expandListener);
      return super.onCreateOptionsMenu(menu);
  }

菜单的点击事件需要在onOptionsItemSelected()方法中处理:

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        //根据item.getItemId()处理不同的item
        switch (item.getItemId()){
            case R.id.one:
                break;
            //...
        }
        return super.onOptionsItemSelected(item);
    }
  • 在4.1及以上版本中,还可以通过设置Activity的 android:parentActivityName属性来添加返回上一页的操作。如果要兼容4.1一下版本,需要在Activity中添加meta-data指明name和value
<activity
     android:name=".SecondActivity">
     android:parentActivityName=".MainActivity"-->
     <!--兼容4.1一下版本-->
    <meta-data
       android:name="android.support.PARENT_ACTIVITY"
       android:value=".MainActivity">
    </meta-data>
</activity>

指明了parentActivityName,并且设置了ActionBar 的 actionBar.setDisplayHomeAsUpEnabled(true);无需在显示调用finish()方法,点击左侧导航按钮即可自动返回上一级Activity。

3. 为Toolbar添加ActionView

appcompat-v7为Toolbar提供了几种不同的交互方式。比如,可以为Toolbar添加搜索框或者一个自定义View,添加ActionView的方式有两种:

  • actionViewClass:该View实现了CollapsibleActionView接口
  • actionLayout:布局文件。

添加ActionView,showAsAction的属性值只能是”ifRoom | collapseActionView”
或”never|collapseActionView”,collapseActionView 指明了当用户和它交互时,这个组件怎么显示。

当该组件在appbar上的时候,该组件以图标的形式显示,当该组件在溢出菜单时,就以menu item的形式显示,当用户和该组件交互的时候,该组件会在toolbar上展开。
要获取该ActionView,可以在onCreateOptionMenu()方法中调用getActionView()方法获取

 @Override
public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.main_activity_actions, menu);
        MenuItem item = menu.findItem(R.id.action_search);
        //获取ActionView
        RelativeLayout rl=(RelativeLayout ) item .getActionView();

    return super.onCreateOptionsMenu(menu);
}

也可以注册ActionView显示/隐藏的监听事件,比如说当搜索框显示的时候改变Activity背景颜色等。。


 MenuItem menuItem=menu.findItem(R.id.one);
 //注册MenuItem对象的展开监听事件
 menuItem.setOnActionExpandListener(expandListener);
//展开监听
MenuItem.OnActionExpandListener expandListener=new MenuItem.OnActionExpandListener() {
      @Override
       public boolean onMenuItemActionExpand(MenuItem menuItem) {
           //展开ActionView
           mContainer.setBackgroundColor(Color.parseColor("#C0C0C0"));
           return true;
       }

       @Override
       public boolean onMenuItemActionCollapse(MenuItem menuItem) {
           //ActionView折叠
           mContainer.setBackgroundColor(Color.parseColor("#FFDDDD"));
           return true;
       }
   };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值