La barra delle azioni di Android non mostra overflow


90

Ho una barra delle azioni nella mia app con 3 elementi.

Solo 2 possono essere visualizzati a causa di problemi di spazio, quindi mi aspetto che venga visualizzato il primo e il resto venga visualizzato nell'overflow. Tuttavia in pratica vengono mostrati solo i primi 2 elementi e non è rilevabile un overflow.

Ecco il codice pertinente: 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;
}

120
Se il tuo dispositivo ha un pulsante di menu, l'icona di overflow non verrà visualizzata. Che dispositivo stai usando?
Reinier

1
il dispositivo virtuale su cui sto testando ha effettivamente un pulsante menu, l'ho cliccato e l'elemento mancante è apparso, grazie!
Mats Raemen

2
@Reinier Sto usando ActionBarSherlock. Su Galaxy Ace con versione 2.3 viene mostrato, su Galaxy SII con 4.0 non viene mostrato. Entrambi hanno il pulsante del menu HW.
Mister Smith

2
Volevo confermare che questo mi aveva sconcertato dal fatto che avevo l'icona di overflow su un nexus 7 non acquistato su Galaxy Note II. La nota aveva un pulsante di menu. Grazie!
bsautner

@Reinier per favore aiutami ad affrontare lo stesso problema cosa dovrei fare?
rupesh

Risposte:


125

Se vuoi mostrare i tre punti, indipendentemente dal pulsante del menu del dispositivo! quindi puoi chiamare questo metodo nella classe dell'applicazione 'metodo onCreate-

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

32
Questo è un terribile hack che rompe la coerenza con il resto delle app sulla piattaforma. Non farlo.
adamp

19
Questo sembra il minore di due mali. Il comportamento attuale è inaccettabile.
biorbnA

6
È un ottimo modo per consentire l'overflow, il tasto hardware del menu non dovrebbe più essere tollerato.
Necronet

5
Funziona benissimo! Funziona anche se l'utente preme il pulsante del menu hardware (che è geniale), anche se sentirai l'effetto sonoro del menu due volte .. qualcuno sa come farlo suonare solo una volta?
Bruce

5
QUESTO NON È UN HACK. Gli sviluppatori devono sapere cosa chiamare hack perché non è 2 + 2 in Android. La riflessione fa risparmiare tempo usando i meccanismi Java, altrimenti passeresti i contesti alle tue classi interne 24 ore su 24, 7 giorni su 7, o personalizzerai AOSP all'infinito. Per me questa soluzione risolve il problema di dover sovrascrivere e includere tonnellate di contenuti personalizzati AOSP E associazioni private collegate solo per il bene di ciò che i puristi considerano pulito. Sapevi che non puoi forzare FASTSCROLL abilitato in modo coerente per piccoli elenchi? Prima di utilizzare la riflessione, questo mi richiedeva di copiare più di 10 risorse AOSP, per una modifica di un carattere.
leRobot

54

Barra dell'azione

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

}

Scarica il set di icone della barra delle azioni


2
Dai un'occhiata al commento di @Reinier, è vero "Se il tuo dispositivo ha un pulsante menu, l'icona di overflow non verrà visualizzata".
Ahmad Dwaik 'Warlock'

Provo nel dispositivo con il pulsante del menu e nel mio caso viene visualizzato l'overflow. Uso android:showAsAction="always"per più oggetti
Kirit Vaghela

su quale dispositivo l'hai testato? Ho usato un neo v xperia es #
Ahmad Dwaik 'Warlock'

1
Nota: l'elemento che gonfia il menu extra DEVE mostrareAsAction = "sempre"
Kirit Vaghela

1
showAsAction non è disponibile nello spazio dei nomi Android negli SDK precedenti. Segui questo link developer.android.com/training/basics/actionbar/… per superare questo problema. Dopo aver aggiunto questo schema NS.android.com/apk/res-auto , il trucco sopra ha funzionato perfettamente per me
chedine

42

Mi rendo conto che questo non è un menu di overflow, ma è simile. Ok, questo è semplice ma è stato difficile da capire.

Per prima cosa è necessaria una voce di menu che si desidera utilizzare come dispositivo di gonfiaggio del trabocco. Esempio

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

Una volta ottenuto il tuo articolo, aggiungi un sottomenu contenente gli elementi che desideri nel menu di overflow. Esempio:

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

Al clic questo gonfierà altri oggetti all'interno. La mia applicazione utilizza ActionBarSherlock 4.0 quindi prima che funzioni per te, dovrai accedere alla "SplitActionBar". (Funzionerà ancora sulla barra delle azioni Android predefinita)

Ecco come: nel tuo file AndroidManifest.xml, devi aggiungere questo codice sotto l'attività in cui hai bisogno del menu di overflow.

android:uiOptions="splitActionBarWhenNarrow"

NOTA: l'elemento che gonfia il menu di overflow DEVEshowAsAction="always"

Vwola! hai un menu extra! Spero di averti aiutato. :)


3
Bella soluzione, migliore dell'hack del pulsante del menu.
ol0

26

Sui dispositivi con pulsanti del menu hardware (Galaxy S3, testardo come Samsung è ...) il menu di overflow si comporta come il menu "tradizionale", utilizzando il pulsante del menu hardware.


2
La vecchia risposta, tuttavia con la libreria di compatibilità si imbatte in risultati molto strani: 3 dispositivi con pulsante hardware, Nota 3 Neo = viene visualizzato il menu Overflow, il pulsante menu non funziona, Nota 1 = Nessun overflow, il pulsante menu funziona, Galaxy S3, no overflow, il pulsante menu non funziona! Questo è pazzesco.
3c71

5

Quando dici menu "overflow", intendi i tre punti che compaiono alla fine per indicare che ci sono più elementi ... o intendi la barra delle azioni divisa che appare in basso per gli elementi in overflow?

Se intendi la barra delle azioni divisa, dovresti aggiungerla al file manifest della tua attività

android:uiOptions="splitActionBarWhenNarrow"

Per impostazione predefinita, il menu di overflow dei tre punti dovrebbe avvenire automaticamente, quindi è difficile dire quale sia il problema dalle informazioni fornite sopra.


Intendo i tre punti. Non è che sia a causa degli oggetti, perché ogni volta che si cambiano gli elementi dell'ordine, vengono mostrate le prime 2 icone
Mats Raemen

devo fornire informazioni aggiuntive per poter determinare il problema reale?
Mats Raemen

Quali sono i tuoi minSdkVersion, targetSdkVersion e la versione su cui stai testando?
Sparky

5
Il tuo dispositivo ha pulsanti fisici per il menu o sono pulsanti virtuali come il telefono Galaxy Nexus? Penso che i tre punti verranno visualizzati solo se il tuo telefono non ha pulsanti fisici.
wnafee

5

Per mostrare sempre l'overflow dell'azione (tre punti) su actionbarcompat:
nel file menu, esempio:
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>

e nel file attività:

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

Ha funzionato bene per me.
Testato su Google Nexus S, Samsung S3.


3

Sembra che sui dispositivi con un pulsante di menu il menu di overflow non venga visualizzato nella ActionBar. Inoltre non abbiamo modo di sapere se un dispositivo ha un pulsante del menu hardware prima del livello API 14 (4.0+).

Questa soluzione aggiunge un pulsante di overflow a uno android.support.v7.app.ActionBarche apre il menu delle opzioni standard solo su pre-Honeycomb (<3.0), altrimenti lasciandolo al sistema. In ogni caso puoi scegliere tra alwayso ifRoomper tutte le azioni.

Ottieni l'icona di overflow dal pacchetto di icone della barra delle azioni .

Aggiungi un menu (sto omettendo alcune parti non rilevanti come titoli, ordinazioni, ecc.)

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

Rimuovi la nostra azione di overflow su 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);
}

Infine chiama Activity.openOptionsMenu()dall'azione overflow.

Ehm ... no. Non puoi non chiamare openOptionsMenu()da un pulsante del menu ... ma se stai usando AndroidAnnotations puoi farlo facilmente:

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

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

Altrimenti dovresti fare qualcosa del genere, suppongo

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

2

Prova a cambiare il tema dell'app da Theme.AppCompat.Light.DarkActionBar a Theme.AppCompat.Light


2

Metti il xmlns:your_app_name="http://schemas.android.com/apk/res-auto"tag del menu all'interno e invece android:showAsAction="always"usayour_app_name:showAsAction="always"

per es

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.