W mojej aplikacji mam pasek akcji z 3 elementami.
Ze względu na problemy z przestrzenią można wyświetlić tylko 2, więc spodziewałbym się, że pierwsza zostanie wyświetlona, a reszta zostanie wyświetlona w przepełnieniu. Jednak w praktyce wyświetlane są tylko pierwsze 2 pozycje i nie można wykryć przepełnienia.
Oto odpowiedni kod: list_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/menu_insert"
android:icon="@android:drawable/ic_menu_add"
android:title="@string/menu_insert"
android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_call"
android:icon="@android:drawable/ic_menu_call"
android:title="@string/menu_call"
android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_agenda"
android:icon="@android:drawable/ic_menu_agenda"
android:title="@string/menu_agenda"
android:showAsAction="ifRoom|withText"/>
</menu>
Activity.java
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater mi = getMenuInflater();
mi.inflate(R.menu.list_menu, menu);
return true;
}
android
overflow
android-actionbar
Mats Raemen
źródło
źródło
Odpowiedzi:
Jeśli chcesz pokazać trzy kropki, niezależnie od przycisku menu urządzenia! możesz wywołać tę metodę w swojej klasie aplikacji 'onCreate method-
private void makeActionOverflowMenuShown() { //devices with hardware menu button (e.g. Samsung Note) don't show action overflow menu 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) { Log.d(TAG, e.getLocalizedMessage()); } }
źródło
res / menu / menu.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <!-- Search / will display always --> <item android:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:showAsAction="always" android:title="@string/action_search"/> <!-- Location Found --> <item android:id="@+id/action_location_found" android:icon="@drawable/ic_action_location_found" android:showAsAction="always" android:title="@string/action_location_found"/> <!-- More --> <item android:id="@+id/a_More" android:icon="@drawable/ic_action_overflow" android:showAsAction="always" android:title="More"> <menu> <!-- Refresh --> <item android:id="@+id/action_refresh" android:icon="@drawable/ic_action_refresh" android:showAsAction="never" android:title="@string/action_refresh"/> <!-- Help --> <item android:id="@+id/action_help" android:icon="@drawable/ic_action_help" android:showAsAction="never" android:title="@string/action_help"/> <!-- Check updates --> <item android:id="@+id/action_check_updates" android:icon="@drawable/ic_action_refresh" android:showAsAction="never" android:title="@string/action_check_updates"/> </menu> </item> </menu>
MainActivity.java
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return super.onCreateOptionsMenu(menu); } }
Pobierz zestaw ikon paska akcji
źródło
android:showAsAction="always"
do większej ilości pozycjiZdaję sobie sprawę, że to nie jest przepełnione menu, ale jest podobne. OK, to jest proste, ale trudno było to rozgryźć.
Najpierw potrzebujesz pozycji menu, której chcesz użyć jako inflatora przepełnienia. Przykład
<item android:id="@+id/a_More" android:icon="@drawable/more" android:showAsAction="always" android:title="More"> </item>
Gdy masz już element, dodaj podmenu zawierające żądane elementy w rozszerzonym menu. Przykład:
<item android:id="@+id/a_More" android:icon="@drawable/more" android:showAsAction="always" android:title="More"> <menu> <item android:id="@+id/aM_Home" android:icon="@drawable/home" android:title="Home"/> </menu> </item>
Po kliknięciu spowoduje to nadmuchanie innych przedmiotów w ciągu. Moja aplikacja korzysta z ActionBarSherlock 4.0, więc zanim to zadziała, musisz uzyskać dostęp do „SplitActionBar”. (Nadal będzie działać na domyślnym pasku akcji Androida)
Oto jak: w pliku AndroidManifest.xml musisz dodać ten kod pod działaniem, w którym potrzebujesz przepełnionego menu.
android:uiOptions="splitActionBarWhenNarrow"
UWAGA: Twój przedmiot, który wypełnia twoje przepełnione menu, MUSI
showAsAction="always"
Vwola! masz przepełnione menu! Mam nadzieję, że ci pomogłem. :)
źródło
Na urządzeniach ze sprzętowymi przyciskami menu (Galaxy S3, uparty jak Samsung ...) przepełnione menu zachowuje się jak `` tradycyjne '' menu, używając przycisku menu sprzętowego.
źródło
Kiedy mówisz „przepełnione” menu, czy masz na myśli trzy kropki, które pojawiają się na końcu, aby wskazać, że jest więcej elementów ... czy masz na myśli podzielony pasek akcji, który pojawia się na dole dla przepełnionych elementów?
Jeśli masz na myśli podzielony pasek działań, dodaj go do pliku manifestu swojej aktywności
android:uiOptions="splitActionBarWhenNarrow"
Domyślnie menu przepełnienia trzema kropkami powinno pojawiać się automatycznie, więc trudno jest stwierdzić, na czym polega problem na podstawie informacji podanych powyżej.
źródło
Zawsze pokazuj przepełnienie akcji (trzy kropki) na actionbarcompat:
w pliku menu, przykład:
main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/action_settings" android:title="@string/action_settings" app:showAsAction="never"/> <item android:id="@+id/action_about" android:title="@string/action_about" app:showAsAction="never"/> </menu>
aw aktach:
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return super.onCreateOptionsMenu(menu); }
U mnie działa dobrze.
Przetestowano na Google Nexus S, Samsung S3.
źródło
Wygląda na to, że na urządzeniach z przyciskiem menu rozszerzone menu nie jest wyświetlane na pasku akcji. Nie mamy również możliwości sprawdzenia, czy urządzenie ma przycisk menu sprzętowego przed poziomem API 14 (4.0+).
To rozwiązanie dodaje przycisk przepełnienia do a,
android.support.v7.app.ActionBar
który otwiera standardowe menu opcji tylko w wersji sprzed plastra miodu (<3.0), w przeciwnym razie pozostawia to dla systemu. W każdym razie możesz wybrać pomiędzyalways
lubifRoom
dla wszystkich działań.Pobierz ikonę przepełnienia z pakietu ikon paska akcji .
Dodaj menu (mam kilka nieistotnych części, takich jak tytuły, zamówienie itp.)
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_overflow" android:orderInCategory="100" android:icon="@drawable/ic_action_overflow" app:showAsAction="always" /> <item android:id="@+id/action_first" app:showAsAction="always" /> <item android:id="@+id/action_second" app:showAsAction="ifRoom" /> </menu>
Usuń naszą akcję przepełnienia w wersji 3.0+
@Override public boolean onPrepareOptionsMenu(Menu menu) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { menu.removeItem(R.id.action_overflow); } return super.onPrepareOptionsMenu(menu); }
Na koniec zadzwoń
Activity.openOptionsMenu()
z akcji przepełnienia.Eee nie. Nie możesz nie zadzwonić
openOptionsMenu()
z przycisku menu ... ale jeśli używasz adnotacji Androida, możesz zrobić to łatwo:@OptionsItem void action_overflow() { openOptionsMenuDeferred(); } @UiThread void openOptionsMenuDeferred() { openOptionsMenu(); }
Jeśli nie, przypuszczam, że powinieneś zrobić coś takiego
@Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == id.action_overflow) { openOptionsMenuDeferred(); return true; } } private Handler handler = new Handler(Looper.getMainLooper()); public void openOptionsMenuDeferred() { handler.post(new Runnable() { @Override public void run() { openOptionsMenu(); } } ); }
źródło
Spróbuj zmienić motyw aplikacji z Theme.AppCompat.Light.DarkActionBar na Theme.AppCompat.Light
źródło
Umieść
xmlns:your_app_name="http://schemas.android.com/apk/res-auto"
tag menu wewnątrz i zamiast tegoandroid:showAsAction="always"
użyjyour_app_name:showAsAction="always"
np
<item android:id="@+id/action_search" android:icon="@drawable/icon_search" android:title="@string/search" your_app_name:showAsAction="ifRoom"/>
źródło