ツールバーシリーズの記事のナビゲーション
AndroidのナビゲーションバーにあるオーバーフローメニューOverflowMenu
Androidのナビゲーションバーの検索ボックスSearchView
Androidのナビゲーションバーのカスタムナビゲーションレイアウト
AndroidでのナビゲーションバーのタブナビゲーションとTabLayoutの使用法
前回ツールバーの使い方についてお話しましたが、今回はオーバーフローメニューの使い方についてお話しました。オーバーフローメニューとは何ですか?簡単なポイントは、ツールバーの右側にあるアイコンのコレクションです。前述のコンテキストメニューに似ていますが、今回は追加のshowAsActionオプションがあるため、最初にこの属性のオプションの値をリストします。
配置タイプ | 説明 |
常に | ナビゲーションバーには常にメニューアイコンを表示してください |
ifRoom | ナビゲーションバーの右側にスペースがある場合、アイテムはナビゲーションバーに直接表示され、オーバーフローメニューは配置されません。 |
決して | ナビゲーションバーに直接表示しないでください。常にオーバーフローメニューリストに表示してください。 |
withText | アイコンに加えて、ナビゲーションバーに表示できる場合は、アイテムの説明テキストも表示する必要があります |
折りたたみアクションビュー | 操作ビューはボタンに折りたたむ必要があります。ボタンをクリックして操作ビューを展開します。これは主に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>
次に、前回ツールバーが導入された後も、次のコードを追加して、アクティビティを書き込み続けます。
@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メソッドでクリックイベントに応答することができます。