Używam nowej biblioteki appcompat w wersji 7, dostępnej od Androida 4.3 (poziom API 18).
Niezależnie od tego, co jest określone w showAsAction dla elementu menu, nie jest ono wyświetlane - zawsze tworzy ikonę menu przepełnienia i umieszcza nawet pojedynczy element menu pod menu.
Próbuję dodać menu do takiej czynności:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_sizes, menu);
return true;
}
A oto moje menu xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_add_size"
android:title="@string/menu_add_item"
android:orderInCategory="10"
android:showAsAction="always"
android:icon="@android:drawable/ic_menu_add" />
</menu>
Czy to błąd nowej biblioteki wsparcia v7, czy po prostu coś nie tak z kodem? Wiele razy używałem podobnego kodu w ActionBarSherlock.
"always"
nie jest zalecane; lepiej jest użyć"ifRoom"
i pozwolić systemowi operacyjnemu zdecydować”.Odpowiedzi:
Prawdopodobnie brakuje wymaganej przestrzeni nazw:
Zastąp
[yourapp]
nazwę swojej aplikacji lub dowolną przestrzenią nazw, której dusza zapragnie.Inne rzeczy warte sprawdzenia:
ActionBarActivity
Sprawdź, czy problem nadal występuje.
Dokumentacja referencyjna systemu Android: Dodawanie przycisków akcji . Oto odpowiedni tekst:
źródło
showAsAction
atrybut nie istniał w systemie Android-7, musisz użyć przestrzeni nazw aplikacjihttp://schemas.android.com/apk/res-auto
w każdym przykładzie. To nie jest niestandardowy ani taki, który pasuje do Twojej aplikacji. To jest rzeczywista przestrzeń nazw z dokumentacji. Myślę, że każdy ma na myśli niestandardowy prefiks , a właściwie może to być cokolwiek chcesz. Czy to prawda?Zrozumiałem. Dzięki bibliotece wsparcia v7 showAsAction powinno znajdować się w niestandardowej przestrzeni nazw, takiej jak ta:
źródło
Upewnij się również, że używasz prawidłowego inflatera w metodzie ActionBarActivity.onCreateOptionsMenu ().
Prawidłowe rozwiązanie:
Nieprawidłowe rozwiązanie:
źródło
Dla fragmentów
Menu z niestandardową przestrzenią nazw zapobiegną wyświetlaniu showAsAction.
Używanie prefiksu „android:” dla showAsAction zadziała, mimo że Android Studio zauważy, że należy użyć niestandardowej przestrzeni nazw.
Używa to Android SDK 22 i fragmentów Support v4, na wypadek gdyby miało to jakiekolwiek znaczenie.
źródło
tools:ignore
.Mam ten sam problem, ale na Androidzie 5. Mam 3 pozycje, ale system operacyjny zignorował mój atrybut „zawsze” i pokazał tylko 2 pozycje. Oto moje rozwiązanie:
źródło
setShowAsActionFlags()
wymaga API 14, ale nadal było to dla mnie najlepsze rozwiązanie.Upewnij się również, że masz poprawną ścieżkę do przestrzeni nazw. Nie wyświetli komunikatu o błędzie, jeśli jest źle.
miałem
zamiast
Wiedziałem tylko, że to nie działa. Nie jestem pewien, jak udało mi się zapomnieć o części ścieżki / apk, ale tak się stało. Brak komunikatu o błędzie, tylko nieuchwytny błąd do wyśledzenia.
źródło
W moim przypadku musiałem usunąć z kompilacji build.gradle mojej aplikacji „com.android.support:appcompat-v7:21.0.3”.
Uwaga : Moje min sdk = 14 i utworzony projekt przez studio android wstawił moją niepotrzebną zależność.
Po tej zamianie możesz napisać android: showAsAction = "zawsze"
źródło
To może nie być twój przypadek, ale używałem
new MenuInflater(this).inflate(R.menu.my_menu, menu);
zmiana na
getMenuInflater().inflate(R.menu.my_menu, menu);
naprawiono problem!
źródło
nie działa, z supportLibraryVersion = '25 .1.0 'compileSdkVersion = 25
zobacz „Ostrzeżenie”
Powinien używać app: showAsAction z biblioteką appcompat z xmlns: app = "http://schemas.android.com/apk/res-auto" mniej ... (Ctrl + F1)
Korzystając z biblioteki appcompat, zasoby menu powinny odnosić się do showAsAction w app: namespace, a nie do android: namespace.
Podobnie, gdy nie używasz biblioteki appcompat, powinieneś używać atrybutu android: showAsAction.
Myślę, że ostrzeżenie można zignorować.
źródło
dodaj niestandardową przestrzeń nazw, taką jak ta, aby showAsAction i actionViewClass:
źródło
Rozwiązałem to, zastępując
z
Tak wygląda menuitme xml,
źródło
Najprostszym sposobem jest zmodyfikowanie kodu poprzez dodanie
i zmień ten kod
do
i w końcu
źródło