webentwicklung-frage-antwort-db.com.de

Android 4.3 Menüeintrag showAsAction = "immer" wird ignoriert

Ich verwende die neue v7 appcompat-Bibliothek, die ab Android 4.3 (API-Level 18) verfügbar ist.

Unabhängig davon, was in showAsAction für ein Menüelement angegeben ist, wird es nicht angezeigt - es erstellt immer das Symbol für das Überlauf-Menü und fügt sogar ein einzelnes Menüelement unter dem Menü hinzu.

Der Versuch, ein Menü zu einer Aktivität wie dieser hinzuzufügen:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_sizes, menu);
    return true;
}

Und hier ist meine Menü-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>

Handelt es sich um einen Fehler in der neuen Unterstützungsbibliothek v7 oder liegt nur ein Problem mit dem Code vor? Ich habe den ähnlichen Code schon oft mit ActionBarSherlock verwendet.

113
Mcingwe

Vermutlich fehlt Ihnen der erforderliche Namespace:

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

Ersetzen Sie [yourapp] durch Ihren App-Namen oder einen beliebigen Namensraum, den Ihr Herz überall möchte.

Andere Dinge, die es zu prüfen gilt:

  • Prüfen Sie, ob Ihre Aktivitätsklasse ActionBarActivity erweitert.

Überprüfen Sie, ob das Problem weiterhin besteht.


Android Referenzdokumentation: Hinzufügen von Aktionsschaltflächen . Hier ist der relevante Text:

Wenn Ihre App die Support Library zur Kompatibilität unter Android 2.1 verwendet, ist das showAsAction-Attribut nicht im Namespace Android: verfügbar. Stattdessen wird dieses Attribut von der Support Library bereitgestellt, und Sie müssen Ihren eigenen XML-Namespace definieren und diesen Namespace als Attributpräfix verwenden. (Ein benutzerdefinierter XML-Namespace sollte auf Ihrem App-Namen basieren, kann jedoch ein beliebiger Name sein und ist nur innerhalb des Bereichs der Datei verfügbar, in der Sie ihn deklarieren.) 

308

Ich habe es selbst herausgefunden. Mit der Unterstützungsbibliothek v7 sollte die showAsAction unter einem benutzerdefinierten Namespace wie folgt abgelegt werden:

<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>
52
Mcingwe

Stellen Sie außerdem sicher, dass Sie den richtigen Inflater in der ActionBarActivity.onCreateOptionsMenu () - Methode verwenden.

Richtige Lösung:

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

Falsche Lösung:

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

Für Fragmente 

Menüs mit benutzerdefiniertem Namensraum werden verhindern showAsAction angezeigt.

Die Verwendung des Präfixes "Android:" für showAsAction funktioniert, auch wenn Android Studio merkt, dass Sie sollten einen benutzerdefinierten Namensraum verwenden.

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

Hierbei werden Android SDK 22- und Support v4-Fragmente verwendet, falls dies einen Unterschied macht.

23
Baker

Habe das gleiche Problem, aber auf Android 5. Ich habe 3 Elemente, aber OS ignorierte mein Attribut "immer" und zeigte nur 2 Elemente. Hier meine Lösung:

  @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);
    }
}
16
Lukas

In meinem Fall musste ich build.gradle kompilieren "com.Android.support:appcompat-v7:21.0.3" meiner App entfernen.

Hinweis : Mein min sdk = 14, und ein von Android Studio erstelltes Projekt fügte meine unnotwendige Abhängigkeit hinzu.

Nach diesem Ersetzen können Sie .__ schreiben. Android: showAsAction = "immer"

6
Anton Kizema

Stellen Sie außerdem sicher, dass Sie den richtigen Pfad für den Namespace haben. Es wird keine Fehlermeldung angezeigt, wenn es falsch ist.

Ich hatte

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

anstatt

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

Ich wusste nur, dass es nicht funktionierte. Nicht sicher, wie ich es geschafft habe, den/apk-Teil des Pfads zu vergessen, aber es ist passiert. Keine Fehlermeldung, nur ein schwer zu findender Fehler.

6
BeccaP

Dies könnte nicht Ihr Fall sein, aber ich habe verwendet

new MenuInflater(this).inflate(R.menu.my_menu, menu);

ändern Sie es auf

getMenuInflater().inflate(R.menu.my_menu, menu);

problem behoben!

4
Bakhshi

Der einfachste Weg ist Ändern Sie Ihren Code durch Hinzufügen 

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

und ändern Sie diesen Code

Android:showAsAction="always"

zu

app:showAsAction="always"

und schlussendlich

<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>
0

Ich habe es durch Ersetzen gelöst

Android:showAsAction="ifRoom"

mit 

app:showAsAction="ifRoom"

Das ist menuitme xml aussehen,

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

Der einfachste Weg ist:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:myapp="http://schemas.Android.com/apk/res-auto">

    <item
        Android:id="@+id/history"
        Android:icon="@drawable/icons8_history_white_medium"
        Android:title="History"
        myapp:showAsAction="always" />
    <item
        Android:id="@+id/synchrnonize"
        Android:icon="@drawable/icons8_synchronize_white_medium"
        Android:title="Synchronize"
        myapp:showAsAction="always" />
</menu>
0
Paweł

fügen Sie einen benutzerdefinierten Namespace wie folgt zu showAsAction und actionViewClass hinzu:

<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
<?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>

arbeite nicht, mit supportLibraryVersion = '25 .1.0 ' compileSdkVersion = 25 

siehe die "Warnung" 

Sollte app: showAsAction mit der appcompat-Bibliothek mit Xmlns verwenden: app = "http://schemas.Android.com/apk/res-auto" weniger ... (Strg + F1) 

Wenn Sie die appcompat-Bibliothek verwenden, sollten sich die Menüressourcen auf die showAsAction im app: namespace, Nicht auf den android: namespace beziehen. 

Wenn Sie nicht die appcompat-Bibliothek verwenden, sollten Sie __. Das Attribut Android: showAsAction verwenden.

Ich denke, die Warnung kann ignoriert werden.

0
Bill