Overflow menusはメニューのアイテムをツールバー(アクションバー)へ表示することが出来ます。
その方法を紹介します。
showAsAction属性の指定
「Overflow menusの実装」で紹介したサンプルのような、メニューを表示するだけの実装の場合、メニューのアイテムはオーバーフローアイコンに隠されます。
オーバーフローアイコンに隠された状態ではなく、メニューのアイテムをツールバー(アクションバー)へ表示させることが出来ます。
アイテムをツールバーへ表示させるためにshowAsAction属性を指定します。


アイテムのタイトルを表示
showAsAction属性は3つのタイプがあり、それぞれの動作は次の通りです。
| showAsAction | アイテムの表示 | 表示例 |
|---|---|---|
| ifRoom | 配置が許される範囲へ表示 配置が許される個数を表示 上記から溢れるアイテムは隠される | ![]() ※すべてのアイテムがifRoom |
| 【注意】 ・アプリ名とアイテムが重なる時、アイテムの表示を優先する |
||
| always | 常に表示する | ![]() ※すべてのアイテムがalways |
| 【注意】 ・アプリ名とアイテムが重なる時、アイテムの表示を優先する |
||
| never、なし (デフォルト) | 常に表示しない 全てのアイテムが隠される | ![]() ※すべてのアイテムがnever |
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_file"
android:title="File"
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_edit"
android:title="Edit"
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_help"
android:title="Help"
app:showAsAction="ifRoom" />
</menu>
表示できなかった(配置が許される範囲・個数から溢れた)アイテムはオーバーフローアイコンに隠されます。
アイテムのアイコンを表示
icon属性へアイコン画像が指定されていると、タイトルよりもアイコンを優先して表示します。
| showAsAction | 説明 | 表示例 |
|---|---|---|
| ifRoom | 配置が許される範囲へ表示 配置が許される個数を表示 上記から溢れるアイテムは隠される | ※すべてのアイテムがifRoom |
| 【注意】 ・アプリ名とアイテムが重なる時、アイテムの表示を優先する |
||
| always | 常に表示する | ※すべてのアイテムがalways |
| 【注意】 ・アプリ名とアイテムが重なる時、アイテムの表示を優先する |
||
| never、なし (デフォルト) | 常に表示しない 全てのアイテムが隠される | ※すべてのアイテムがnever |
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_file"
android:icon="@drawable/outline_folder_24"
android:title="File"
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_edit"
android:icon="@drawable/outline_edit_24"
android:title="Edit"
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_help"
android:icon="@drawable/outline_help_outline_24"
android:title="Help"
app:showAsAction="ifRoom" />
</menu>
表示できなかった(配置が許される範囲・個数から溢れた)アイテムはオーバーフローアイコンに隠されます。
アイテムのタイトル+アイコンを表示
アイテムのicon属性へアイコン画像が指定されていると、タイトルよりもアイコンを優先して表示します。
アイコンに加えてタイトルも表示したければ、アイテムのshowAsAction属性にwithTextを追加します。
| showAsAction | 説明 | 表示例 |
|---|---|---|
| withText | アイコンと一緒にタイトルも表示する | ※単体の使用は不可 ※ifRoom、alwaysと併用 |
| ifRoom|withText | 配置が許される範囲へ表示 配置が許される個数を表示 上記から溢れるアイテムは隠される | 【幅:320dpの時】![]() 【幅:480dpの時】 ![]() ※すべてのアイテムがifRoom|withText |
| 【注意】 ・画面の幅<480[dp]の時、アイテムのタイトルは表示されない ・アプリ名のタイトルとアイテムが重なる時、アイテムの表示を優先する |
||
| always|withText | 常に表示する | 【幅:320dpの時】![]() 【幅:480dpの時】 ![]() ※すべてのアイテムがalways|withText |
| 【注意】 ・画面の幅<480[dp]の時、アイテムのタイトルは表示されない ・アプリ名のタイトルとアイテムが重なる時、アイテムの表示を優先する |
||
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_file"
android:icon="@drawable/outline_folder_24"
android:title="File"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/menu_edit"
android:icon="@drawable/outline_edit_24"
android:title="Edit"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/menu_view"
android:icon="@drawable/outline_monitor_24"
android:title="View"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/menu_search"
android:icon="@drawable/outline_search_24"
android:title="Search"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/menu_help"
android:icon="@drawable/outline_help_outline_24"
android:title="Help"
app:showAsAction="ifRoom|withText" />
</menu>
表示できなかった(配置が許される範囲・個数から溢れた)アイテムはオーバーフローアイコンに隠されます。
「配置が許される範囲・個数」とは
ツールバー(アクションバー)の最も重要な役割はアプリ名を表示することがです。
メニューのアイテム(タイトル、アイコン)をツールバーに表示するとき、アプリ名の表示を妨げないように、アイテムの「配置が許される範囲・個数」が決められています。
この範囲・個数は、固定ではありません。画面の幅が広ければ大きくなるし、狭ければ小さくなります。これらの関係は次のように定義されています。
| 画面の大きさ[dp] | 許される個数 (アイコンを並べた幅[dp]) | 許される範囲 |
|---|---|---|
| 000≧画面の幅>600 | 5(280) | 画面の幅/2 |
| 600≧画面の幅≧500 | 4(224) | |
| 500>画面の幅≧360 | 3(168) | |
| 360>画面の幅 | 2(112) | |
| ※アイコンサイズ:56×56[dp] | ||
public class ActionBarPolicy {
...
/**
* Returns the maximum number of action buttons that should be permitted within an action
* bar/action mode. This will be used to determine how many showAsAction="ifRoom" items can fit.
* "always" items can override this.
*/
public int getMaxActionButtons() { // 許される個数
final Configuration config = mContext.getResources().getConfiguration();
final int width = config.screenWidthDp;
final int height = config.screenHeightDp;
final int smallest = config.smallestScreenWidthDp;
if (smallest > 600 || (width > 960 && height > 720) || (width > 720 && height > 960)) {
// For values-w600dp, values-sw600dp and values-xlarge.
return 5;
} else if (width >= 500 || (width > 640 && height > 480) || (width > 480 && height > 640)) {
// For values-w500dp and values-large.
return 4;
} else if (width >= 360) {
// For values-w360dp.
return 3;
} else {
return 2;
}
}
...
public int getEmbeddedMenuWidthLimit() { // 許される範囲
return mContext.getResources().getDisplayMetrics().widthPixels / 2;
}
...
}
ちなみに、記事中のツールバーのスナップショットはスクリーンサイズ320×480[px](mdpi)の端末です。
※mdpiの端末は1[px]=1[dp]です。
関連記事:







