2012-03-16 11 views
89

Nella mia app ho una barra delle azioni con 3 elementi.Barra di azione Android che non mostra overflow

Solo 2 possono essere visualizzati a causa di problemi di spazio, quindi mi aspetto che il primo sia visualizzato e il resto da visualizzare nell'overflow. Tuttavia, in pratica, vengono visualizzati solo i primi 2 elementi e non è possibile rilevare l'overflow.

Ecco il codice in questione: 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; 
} 
+118

Se il dispositivo dispone di un pulsante di menu, l'icona di overflow non verrà visualizzata. Su quale dispositivo stai? – Reinier

+1

il dispositivo virtuale su cui sto effettuando i test ha effettivamente un pulsante del menu, l'ha fatto clic e l'elemento mancante è apparso, grazie! –

+2

@Reinier Sto usando ActionBarSherlock. Su Galaxy Ace in esecuzione 2.3 viene mostrato, su Galaxy SII in esecuzione 4.0 non viene mostrato. Entrambi hanno il pulsante del menu HW. –

risposta

5

Quando dici menu "troppo pieno", vuoi dire i tre punti che compaiono nella fine per indicare che ci sono più elementi .... o intendi la barra di azione divisa che compare in basso per gli elementi di overflow?

Se vuoi dire la barra delle operazioni di divisione, si dovrebbe aggiungere questo al file manifesto del vostro attività

android:uiOptions="splitActionBarWhenNarrow" 

Per impostazione predefinita, il menu di overflow tre punti dovrebbe avvenire automaticamente, quindi è difficile dire quale sia il problema da le informazioni che hai fornito sopra.

+0

Voglio dire i tre punti. Non è come è a causa degli articoli, perché ogni volta che si cambiano gli ordini, sono le prime 2 icone che vengono mostrate –

+0

dovrei fornire informazioni extra per essere in grado di determinare il problema reale? –

+0

Quali sono minSdkVersion, targetSdkVersion e la versione su cui si sta eseguendo il test? – Sparky

26

Sui dispositivi con i 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.

+0

Fantastico, grazie. –

+2

Vecchia risposta, tuttavia con la libreria di compatibilità inciampo su risultati molto strani: 3 dispositivi con pulsante hardware, Nota 3 Neo = Il menu di overflow viene visualizzato, il pulsante del menu non funziona, Nota 1 = Nessun overflow, pulsante del menu funziona, Galaxy S3, nessun overflow, il pulsante menu non funziona! Questo è pazzesco. – 3c71

124

Se si desidera visualizzare i tre punti, indipendentemente dal pulsante del menu del dispositivo! allora si può chiamare questo metodo nella classe di applicazione onCreate metodo-

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 tremendo trucco che rompe la coerenza con il resto delle app sulla piattaforma. Non farlo. – adamp

+18

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

+0

Sono nuovo per Android, e piuttosto sconvolto che questo trucco sia necessario :-(. Tuttavia, non vedo altra alternativa che usarlo! Grazie mille a @Kaushik per averlo rivelato :-). – Stochastically

42

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

Per prima cosa è necessario un elemento del menu che si desidera utilizzare come influsso di overflow. Esempio

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

Una volta che avete il vostro articolo, aggiungere un sottomenu contenente le voci che si desidera 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 su questo si gonfiano altri elementi all'interno. La mia applicazione utilizza ActionBarSherlock 4.0, quindi prima che funzioni per te, dovrai accedere a "SplitActionBar". (Sarà ancora lavorare su di default Android ActionBar)

Ecco come: Nel file AndroidManifest.xml, è necessario aggiungere questo codice sotto l'attività è necessario il menu di overflow in

android:uiOptions="splitActionBarWhenNarrow" 

. NOTA: Il tuo articolo che gonfia il tuo menu di overflow DEVE showAsAction="always"

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

+3

Bella soluzione, meglio del tasto menu hack. – ol0

53

Action Bar

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 Action Bar Icon Set

+2

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

+0

I test in dispositivo con pulsante menu e overflow è mostrato nel mio caso. Io uso 'android: showAsAction =" always "' per più articolo –

+0

su quale dispositivo l'hai provato? Ho usato un neo v xperia e s # –

3

Sembra che su dispositivi con un pulsante del menu del menu di overflow non mostra nel ActionBar. Inoltre, non abbiamo modo di sapere se un dispositivo ha un pulsante menu hardware prima diAPI level 14 (4.0+).

Questa soluzione consente di aggiungere un pulsante di overflow a android.support.v7.app.ActionBar che apre il menu di opzioni standard solo su Honeycomb (< 3.0), altrimenti lasciandolo nel sistema. In ogni caso è possibile scegliere tra o ifRoom per tutte le azioni.

Ottieni l'icona di overflow da Action Bar Icon Pack.

Aggiungere un menu (I'omitting alcune parti non rilevanti come titoli, ordinando 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> 

Rimuovere 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 chiamare Activity.openOptionsMenu() dal troppo pieno azione.

Er ... no. Non si può non chiamare openOptionsMenu() da un pulsante del menu ... ma se si utilizza AndroidAnnotations il gioco è fatto facilmente:

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

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

Se non si dovrebbe fare qualcosa di simile, 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

Put xmlns:your_app_name="http://schemas.android.com/apk/res-auto" all'interno del tag menù invece android:showAsAction="always" uso your_app_name:showAsAction="always"

per esempio

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

2

Provare a cambiare il tema delle app da Theme.AppCompat.Light.DarkActionBar a Theme.AppCompat.Light

4

Per sempre puntuale troppo pieno spettacolo azione (tre punti) sul actionbarcompat:
in file di menu, ad 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 di attività:

012.
@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.

Problemi correlati