ViewConfiguration
リフレクションを使用してアプリのインスタンスにフィールドを設定することで、ハードウェア メニュー ボタンが存在しないように偽装する手っ取り早い汚い方法があります。
次のコード スニップをアクティビティに追加して、onCreate()
.
private void enableActionBarOverflow() {
try {
ViewConfiguration config = ViewConfiguration.get(this);
Field menuKeyField = ViewConfiguration.class
.getDeclaredField("sHasPermanentMenuKey");
if(menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception e) {
e.printStackTrace();
}
}
ViewConfiguration の実装は将来のある時点で変更される可能性があるため、クリーンなソリューションではありません。また、sHasPermanentMenuKey
フィールドがプライベートであるため、フィールドが常にそこにあるという保証はありません。
ただし、これは、メニュー キーのあるデバイスでオーバーフロー メニューが絶対に必要な場合の最後の手段としてのみ使用します。
最小 API が 11 (Honeycomb) 以上であると仮定すると、次のような独自のオーバーフロー メニューを作成することをお勧めします。
menu.xml にオーバーフロー用のメニュー項目を追加し、onCreateOptionsMenu()
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
...
<item
android:id="@+id/action_overflow"
android:icon="@drawable/ic_action_settings"
android:title="@string/settings"
android:showAsAction="always">
</item>
</menu>
、
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater mi = getMenuInflater();
mi.inflate(R.menu.menu, menu);
return super.onCreateOptionsMenu(menu);
}
オーバーフロー メニューで必要な選択肢に対して、個別の overflow_menu.xml リソースを作成します。
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/overflow_action1"
android:title="@string/overflow_action1">
</item>
<item
android:id="@+id/overflow_action2"
android:title="@string/overflow_action2">
</item>
</menu>
onOptionsItemSelected()
メソッドで、オーバーフロー メニューの選択を処理します
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
...
case R.id.action_overflow:
PopupMenu popup = new PopupMenu(
this, findViewById(R.id.action_overflow));
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.overflow_menu, popup.getMenu());
popup.setOnMenuItemClickListener(this);
popup.show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
アクティビティにインターフェイスを実装してPopupMenu.OnMenuItemClickListener
、オーバーフロー アイテムのクリックを処理します
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.overflow_action1:
//do stuff
return true;
case R.id.overflow_action2:
//do stuff
return true;
default:
return false;
}
}