Es gibt einen schnellen und schmutzigen Weg, das Fehlen einer Hardware-Menütaste vorzutäuschen, indem man ein Feld in der App ViewConfiguration
Instanz.
Der folgende Codeschnipsel kann zu Ihrer Aktivität hinzugefügt werden und während 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();
}
}
Dies ist keine saubere Lösung, da sich die Implementierung von ViewConfiguration irgendwann in der Zukunft ändern könnte, und da die sHasPermanentMenuKey
Feld privat ist, gibt es keine Garantie, dass das Feld immer vorhanden sein wird.
Ich würde dies jedoch nur als letzten Ausweg verwenden, wenn Sie unbedingt ein Überlaufmenü auf Geräten mit einer Menütaste haben müssen.
Unter der Annahme, dass Sie mindestens API 11 (Honeycomb) oder höher sind, wäre eine bessere Lösung, Ihr eigenes Überlaufmenü wie folgt zu erstellen:
-
Fügen Sie in Ihrer menu.xml einen Menüpunkt für den Überlauf hinzu und stellen Sie ihn so ein, dass er immer angezeigt wird und sich in Ihrer 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);
}
-
Erstellen Sie eine separate Ressource overflow_menu.xml für die Auswahlmöglichkeiten, die Sie im Überlaufmenü haben möchten
<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>
-
In Ihrem onOptionsItemSelected()
Methode, die Auswahl des Überlaufmenüs
@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);
}
}
-
Umsetzung der PopupMenu.OnMenuItemClickListener
Schnittstelle in Ihrer Aktivität, um die Klicks auf die Überlaufelemente zu verarbeiten
@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;
}
}