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;
}
};