Toolbar系列文章导航
上次我们说了关于Toolbar的使用,这次说一下溢出菜单的使用。什么是溢出菜单?说的简单点就是Toolbar右侧的图标集合。和之前讲过的上下文菜单差不多,不过这次多了一个showAsAction选项,所以咱们先列一下这个属性的可选值。
展示位置类型 | 说明 |
always | 总是在导航栏上显示菜单图标 |
ifRoom | 如果导航栏右侧有空间,该项就直接显示在导航栏上,不再放入溢出菜单 |
never | 从不在导航栏上直接显示,一直放在溢出菜单列表里 |
withText | 如果能在导航栏上显示,除了显示图标,还要显示该项的文字说明 |
collapseActionView | 操作视图要折叠为一个按钮,点击该按钮再展开操作视图,主要用于SearchView |
示例代码如下:
首先我们在res--menu包中创建一个menu_overflow.xml文件,其中代码如下
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" >
<item
android:id="@+id/menu_refresh"
android:orderInCategory="1"
android:icon="@mipmap/ic_refresh"
app:showAsAction="never"
android:title="刷新"/>
<item
android:id="@+id/menu_about"
android:orderInCategory="8"
android:icon="@mipmap/ic_about"
app:showAsAction="never"
android:title="关于"/>
<item
android:id="@+id/menu_quit"
android:orderInCategory="9"
android:icon="@mipmap/ic_quit"
app:showAsAction="never"
android:title="退出"/>
</menu>
接着我们在Activity中接着上次引入Toolbar后继续编写,加入如下代码
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
// 显示菜单项左侧的图标
setOverflowIconVisible(featureId, menu);
return super.onMenuOpened(featureId, menu);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// 从menu_overflow.xml中构建菜单界面布局
getMenuInflater().inflate(R.menu.menu_overflow, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) { // 点击了工具栏左边的返回箭头
finish();
} else if (id == R.id.menu_refresh) { // 点击了刷新图标
Toast.makeText(this,"刷新了",Toast.LENGTH_SHORT).show();
return true;
} else if (id == R.id.menu_about) { // 点击了关于菜单项
Toast.makeText(this, "这个是工具栏的演示demo", Toast.LENGTH_LONG).show();
return true;
} else if (id == R.id.menu_quit) { // 点击了退出菜单项
finish();
}
return super.onOptionsItemSelected(item);
}
// 显示OverflowMenu的Icon
public static void setOverflowIconVisible(int featureId, Menu menu) {
// ActionBar的featureId是8,Toolbar的featureId是108
if (featureId % 100 == Window.FEATURE_ACTION_BAR && menu != null) {
if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
try {
// setOptionalIconsVisible是个隐藏方法,需要通过反射机制调用
Method m = menu.getClass().getDeclaredMethod(
"setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu, true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
这样我们就可以实现溢出菜单的编写,点击事件都在onOptionsItemSelected方法中响应。