Pozycja menu systemu Android 4.3 showAsAction = „zawsze” ignorowana


116

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.


2
W celach informacyjnych - „... "always"nie jest zalecane; lepiej jest użyć "ifRoom"i pozwolić systemowi operacyjnemu zdecydować”.
— ChiefTwoPencils

Odpowiedzi:


313

Prawdopodobnie brakuje wymaganej przestrzeni nazw:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:[yourapp]="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        [yourapp]:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

Zastąp [yourapp]nazwę swojej aplikacji lub dowolną przestrzenią nazw, której dusza zapragnie.

Inne rzeczy warte sprawdzenia:

  • Sprawdź, czy Twoja klasa aktywności się wydłuża ActionBarActivity

Sprawdź, czy problem nadal występuje.


Dokumentacja referencyjna systemu Android: Dodawanie przycisków akcji . Oto odpowiedni tekst:

Jeśli Twoja aplikacja korzysta z biblioteki pomocy technicznej w celu zapewnienia zgodności w wersjach tak niskich, jak Android 2.1, atrybut showAsAction nie jest dostępny w obszarze nazw android:. Zamiast tego ten atrybut jest udostępniany przez bibliotekę obsługi i należy zdefiniować własną przestrzeń nazw XML i użyć tej przestrzeni nazw jako prefiksu atrybutu. (Niestandardowa przestrzeń nazw XML powinna być oparta na nazwie aplikacji, ale może to być dowolna nazwa i jest dostępna tylko w zakresie pliku, w którym ją zadeklarowałeś).


2
Tego też się dowiedziałem. Dziękuję - zdecydowanie przyjęty. Ale showAsAction powinno używać tej niestandardowej przestrzeni nazw.
— Mcingwe,

5
„yourapp” oznacza w String.xml <string name = "app_name"> twojaaplikacja </string>, prawda?
— LOG_TAG

4
Czy ktoś może wyjaśnić, DLACZEGO to działa? Dlaczego istnieje potrzeba rozszerzenia niestandardowej przestrzeni nazw? Trochę zdezorientowany.
— obiad

8
@dineth appcompat jest używany jako projekt biblioteki. Oznacza to, że wszystkie jego zasoby (ciągi znaków, możliwe do rysowania, atrybuty ...) są zadeklarowane w przestrzeni nazw aplikacji zamiast w przestrzeni nazw systemu Android. Ponieważ showAsActionatrybut nie istniał w systemie Android-7, musisz użyć przestrzeni nazw aplikacji
— nicopico

22
Wszyscy mówią „niestandardowa przestrzeń nazw” lub „przestrzeń nazw pasująca do Twojej aplikacji”. Ale przestrzeń nazw jest zawsze http://schemas.android.com/apk/res-autow 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?
— Andrew Arnott,

52

Zrozumiałem. Dzięki bibliotece wsparcia v7 showAsAction powinno znajdować się w niestandardowej przestrzeni nazw, takiej jak ta:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:balloonberry="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        balloonberry:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

1
„balonik” oznacza w String.xml „<string name =" app_name "> balonik </string>", prawda?
— LOG_TAG

5
@LOG_TAG - nie, powinno być tak, jak podano powyżej. To nie jest ciąg, ale przestrzeń nazw.
— BeccaP

ohhh wsparcie v7 errr ... jest ok na wsparcie v4
— Yasitha Waduge

Dzięki za wyjaśnienie Mcingwe
— Sachidananda Naik

32

Upewnij się również, że używasz prawidłowego inflatera w metodzie ActionBarActivity.onCreateOptionsMenu ().

Prawidłowe rozwiązanie:

MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_example, menu);

Nieprawidłowe rozwiązanie:

MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.menu_example, menu);

1
Zdałem wszystkie powyższe odpowiedzi i kolejne odpowiedzi na stackoverflow, ale jedyne czego mi brakowało to Twoja odpowiedź - getMenuInflater (). Dzięki za udostępnienie tego.
— Amt87

Dziękuję bardzo za ten. Przekonwertowałem wszystkie moje ponad 100 menu, aby używały niestandardowej przestrzeni nazw, a 1 śmierdzący ekran nadal nie działał ... okazuje się, że 1 aktywność używała „nowego MenuInflater” zamiast getMenuInflater (). Wielkie dzięki!
— DiscDev

to jest bardzo ważne. Używałem menuInflater create (2 sposoby). Dzięki
— wtk

24

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.

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_add_checkin"
          android:title="Add Checkin"
          android:orderInCategory="10"
          android:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add"/>
</menu>

Używa to Android SDK 22 i fragmentów Support v4, na wypadek gdyby miało to jakiekolwiek znaczenie.


To jedyna rzecz, która rozwiązała mój problem (chociaż pokazuje ten błąd). Dzięki !
— user2630165

3
Możesz pominąć błąd / ostrzeżenie w układzie XML za pomocą narzędzi: ignore = "AppCompatResource" w <item>. Dokumenty tutaj: tools.android.com/tips/lint/suppressing-lint-warnings
— Baker

Twoja odpowiedź i Anton Kizema są dla mnie odpowiednimi rozwiązaniami. A także dzięki za wskazówkę tools:ignore.
— hata

16

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:

  @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.d(TAG, "onCreateOptionsMenu()");
    inflater.inflate(R.menu.your_menu, menu);
    for (int j = 0; j < menu.size(); j++) {
        MenuItem item = menu.getItem(j);
        Log.d(TAG, "set flag for " + item.getTitle());
        item.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
    }
}

1
setShowAsActionFlags()wymaga API 14, ale nadal było to dla mnie najlepsze rozwiązanie.
— Mr. Bungle,

6

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

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:myapp="http://schemas.android.com/res-auto">

zamiast

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:myapp="http://schemas.android.com/apk/res-auto">

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.


6

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"


Dzięki, że mnie rozwiązało! W dzisiejszych czasach może to być najlepsze rozwiązanie w większości przypadków, ponieważ nie jest konieczne wspieranie wersji Androida przed 4.0.
— pinyin_samu

Twoja odpowiedź i Baker's to dla mnie właściwe rozwiązania.
— hata

4

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!


0
<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    >
    <item
        android:id="@id/back"
        android:icon="@drawable/back"
        app:showAsAction="always"
        android:title="@string/back"/>
    <item
        android:id="@id/save"
        android:icon="@drawable/le_top_btn_icon_add"
        app:showAsAction="ifRoom"
        android:title="@string/save"/>
</menu>

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ć.


0

dodaj niestandardową przestrzeń nazw, taką jak ta, aby showAsAction i actionViewClass:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/search"
    android:title="@string/search"
    android:icon="@drawable/ic_search"
    app:showAsAction="collapseActionView|ifRoom"
    app:actionViewClass="android.widget.SearchView" />


0

Rozwiązałem to, zastępując

android:showAsAction="ifRoom"

z

app:showAsAction="ifRoom"

Tak wygląda menuitme xml,

<item android:id="@+id/action_refresh"
      android:title="Refresh"
      android:icon="@drawable/refresh2"
      app:showAsAction="ifRoom" />

0

Najprostszym sposobem jest zmodyfikowanie kodu poprzez dodanie

xmlns:app="http://schemas.android.com/apk/res-auto"

i zmień ten kod

android:showAsAction="always"

do

app:showAsAction="always"

i w końcu

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        app:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.