Android-Aktionsleiste zeigt keinen Überlauf an

90

Ich habe eine Aktionsleiste in meiner App mit 3 Elementen.

Aufgrund von Platzproblemen können nur 2 angezeigt werden, daher würde ich erwarten, dass der erste und der Rest im Überlauf angezeigt werden. In der Praxis werden jedoch nur die ersten beiden Elemente angezeigt, und es ist kein Überlauf erkennbar.

Hier ist der relevante Code: 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;
}
Mats Raemen
quelle
120
Wenn Ihr Gerät über eine Menüschaltfläche verfügt, wird das Überlaufsymbol nicht angezeigt. Auf welchem ​​Gerät bist du?
Reinier
1
Das virtuelle Gerät, auf dem ich teste, hat tatsächlich eine Menüschaltfläche, hat darauf geklickt und das fehlende Element wurde angezeigt, danke!
Mats Raemen
2
@ Reinier Ich benutze ActionBarSherlock. Auf Galaxy Ace mit 2.3 wird es angezeigt, auf Galaxy SII mit 4.0 wird es nicht angezeigt. Beide haben eine HW-Menütaste.
Herr Smith
2
Ich wollte bestätigen, dass ich verblüfft war, dass ich das Überlaufsymbol auf einem Nexus 7-Kauf hatte, nicht auf dem Galaxy Note II. Die Notiz hatte eine Menüschaltfläche. Vielen Dank!
bsautner
@ Reinier, bitte helfen Sie mir, vor dem gleichen Problem zu stehen. Was soll ich tun?
Rupesh

Antworten:

125

Wenn Sie die drei Punkte anzeigen möchten, unabhängig von der Menüschaltfläche des Geräts! Dann können Sie diese Methode in Ihrer Anwendungsklasse 'onCreate method-' aufrufen.

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());
    }
}
Atul Kaushik
quelle
32
Dies ist ein schrecklicher Hack, der die Konsistenz mit den übrigen Apps auf der Plattform bricht. Mach das nicht.
Adamp
19
Dies scheint das kleinere von zwei Übeln zu sein. Das aktuelle Verhalten ist nicht akzeptabel.
BiorbnA
6
Es ist eine großartige Möglichkeit, einen Überlauf zuzulassen. Der Hardkey des Menüs sollte nicht länger toleriert werden.
Necronet
5
Es funktioniert super! Funktioniert auch, wenn der Benutzer die Hardware-Menütaste drückt (was brillant ist), obwohl Sie den Menü-Soundeffekt zweimal hören. Weiß jemand, wie man ihn nur einmal klingen lässt?
Bruce
5
Dies ist kein Hack. Entwickler müssen wissen, wie man Hacks nennt, da es in Android einfach nicht 2 + 2 ist. Reflexion spart Zeit mit Java-Mechanismen, oder Sie übergeben Kontexte rund um die Uhr an Ihre inneren Klassen oder passen AOSP auf unendlich an. Für mich löst diese Lösung das Problem, dass Tonnen von benutzerdefinierten AOSP-Inhalten UND verknüpften privaten Vereinigungen außer Kraft gesetzt und eingeschlossen werden müssen, nur um das zu erreichen, was Puristen für sauber halten. Wussten Sie, dass Sie FASTSCROLL nicht für kleine Listen konsistent aktivieren können? Bevor ich Reflection verwendete, musste ich mehr als 10 AOSP-Ressourcen für eine Bearbeitung mit EINEM Zeichen kopieren.
LeRobot
54

Aktionsleiste

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);
    }

}

Laden Sie das Aktionsleisten-Symbolset herunter

Kirit Vaghela
quelle
2
Werfen Sie einen Blick auf @ Reinier Kommentar, es ist wahr "Wenn Ihr Gerät eine Menüschaltfläche hat, wird das Überlaufsymbol nicht angezeigt".
Ahmad Dwaik 'Hexenmeister'
Ich teste in einem Gerät mit Menüschaltfläche und in meinem Fall wird ein Überlauf angezeigt. Ich benutze android:showAsAction="always"für mehr Artikel
Kirit Vaghela
Auf welchem ​​Gerät haben Sie es getestet? Ich habe ein neo v xperia und s #
Ahmad Dwaik 'Warlock'
1
Hinweis: Ihr Artikel, der Ihr Überlaufmenü aufbläst, MUSS showAsAction = "always"
Kirit Vaghela
1
showAsAction ist in älteren SDKs nicht im Android-Namespace verfügbar. Folgen Sie diesem Link developer.android.com/training/basics/actionbar/… , um dies zu überwinden. Nach dem Hinzufügen dieses NS schemas.android.com/apk/res-auto funktionierte der obige Trick für mich einwandfrei
chedine
42

Mir ist klar, dass dies kein Überlaufmenü ist, aber es ist ähnlich. Okay, das ist einfach, aber schwer herauszufinden.

Sie benötigen zunächst einen Menüpunkt, den Sie als Überlauf-Inflater verwenden möchten. Beispiel

<item
        android:id="@+id/a_More"
        android:icon="@drawable/more"
        android:showAsAction="always"
        android:title="More">
        </item>

Wenn Sie Ihren Artikel haben, fügen Sie im Überlaufmenü ein Untermenü hinzu, das Ihre gewünschten Artikel enthält. Beispiel:

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

Wenn Sie darauf klicken, werden andere Elemente darin aufgeblasen. Meine Anwendung verwendet ActionBarSherlock 4.0. Bevor dies für Sie funktioniert, müssen Sie auf die "SplitActionBar" zugreifen. (Funktioniert weiterhin in der Standard-Android-Aktionsleiste)

So geht's: In Ihrer AndroidManifest.xml-Datei müssen Sie diesen Code unter der Aktivität hinzufügen, in der Sie das Überlaufmenü benötigen.

android:uiOptions="splitActionBarWhenNarrow"

HINWEIS: Ihr Artikel, der Ihr Überlaufmenü aufbläst, MUSSshowAsAction="always"

Vwola! Sie haben ein Überlaufmenü! Hoffe ich habe dir geholfen. :) :)

LeviRockerSk8er
quelle
3
Gute Lösung, besser als der Menüknopf-Hack.
ol0
26

Auf Geräten mit Hardware-Menütasten (Galaxy S3, hartnäckig wie Samsung ...) verhält sich das Überlaufmenü mithilfe der Hardware-Menütaste wie das "traditionelle" Menü.

Lukas Batteau
quelle
2
Alte Antwort, jedoch mit Kompatibilitätsbibliothek nur über sehr merkwürdige Ergebnisse stolpern: 3 Geräte mit Hardware-Taste, Hinweis 3 Neo = Überlauf-Menü wird angezeigt, Menü-Schaltfläche funktioniert nicht, Hinweis 1 = Kein Überlauf, Menü-Schaltfläche funktioniert, Galaxy S3, nein Überlauf, Menütaste funktioniert nicht! Das ist verrückt.
3c71
5

Wenn Sie das Menü "Überlauf" sagen, meinen Sie damit die drei Punkte, die am Ende angezeigt werden, um anzuzeigen, dass mehr Elemente vorhanden sind ... oder die geteilte Aktionsleiste, die unten für Überlaufelemente angezeigt wird?

Wenn Sie die geteilte Aktionsleiste meinen, sollten Sie diese zur Manifestdatei Ihrer Aktivität hinzufügen

android:uiOptions="splitActionBarWhenNarrow"

Standardmäßig sollte das Überlaufmenü mit drei Punkten automatisch angezeigt werden. Daher ist es schwierig, anhand der oben angegebenen Informationen das Problem zu erkennen.

wnafee
quelle
Ich meine die drei Punkte. Es ist nicht so, als ob es an den Gegenständen liegt, denn wenn Sie die Reihenfolge ändern, werden die ersten
beiden
sollte ich zusätzliche Informationen bereitstellen, um das tatsächliche Problem feststellen zu können?
Mats Raemen
Was sind Ihre minSdkVersion, targetSdkVersion und die Version, auf der Sie testen?
Sparky
5
Verfügt Ihr Gerät über physische Tasten für das Menü oder handelt es sich um virtuelle Tasten wie das Galaxy Nexus-Telefon? Ich denke, die drei Punkte werden nur angezeigt, wenn Ihr Telefon keine physischen Tasten hat.
wnafee
5

So zeigen Sie in actionbarcompat immer einen Aktionsüberlauf (drei Punkte) an:
in der
Menüdatei Beispiel: 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>

und in der Aktivitätsdatei:

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

Es hat gut für mich funktioniert.
Getestet auf Google Nexus S, Samsung S3.

MrSiro
quelle
3

Es scheint, dass auf Geräten mit einer Menüschaltfläche das Überlaufmenü nicht in der Aktionsleiste angezeigt wird. Wir können auch nicht wissen, ob ein Gerät vor API-Level 14 (4.0+) über eine Hardware- Menüschaltfläche verfügt.

Diese Lösung fügt eine Überlaufschaltfläche zu einer hinzu android.support.v7.app.ActionBar, die das Standardoptionsmenü nur in Pre-Honeycomb (<3.0) öffnet, andernfalls dem System überlässt. In jedem Fall können Sie zwischen alwaysoder ifRoomfür alle Aktionen wählen .

Rufen Sie das Überlaufsymbol aus dem Aktionsleisten-Symbolpaket ab .

Fügen Sie ein Menü hinzu (ich lasse einige nicht relevante Teile wie Titel, Reihenfolge usw. weg)

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

Entfernen Sie unsere Überlaufaktion ab 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);
}

Rufen Sie schließlich Activity.openOptionsMenu()von der Überlaufaktion auf.

Äh ... nein. Sie können nicht openOptionsMenu()über eine Menüschaltfläche anrufen ... aber wenn Sie AndroidAnnotations verwenden, sind Sie ganz einfach:

@OptionsItem
void action_overflow() {
    openOptionsMenuDeferred();
}

@UiThread
void openOptionsMenuDeferred() {
    openOptionsMenu();
}

Wenn nicht, sollten Sie so etwas tun, nehme ich an

@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();
        }
    }
    );
}
IlDan
quelle
2

Versuchen Sie, das Thema der App von Theme.AppCompat.Light.DarkActionBar in Theme.AppCompat.Light zu ändern

Sagar Devanga
quelle
2

Legen Sie xmlns:your_app_name="http://schemas.android.com/apk/res-auto"innerhalb Menü - Tag und stattdessen android:showAsAction="always"Verwendungyour_app_name:showAsAction="always"

für zB

<item
    android:id="@+id/action_search"
    android:icon="@drawable/icon_search"
    android:title="@string/search"
    your_app_name:showAsAction="ifRoom"/>

Rashmi Jain
quelle