Come forzare l'uso del menu di overflow sui dispositivi con il button menu

Mi piacerebbe avere tutte le voci di menu che non rientrano nell'ActionBar per entrare nel menu di overflow (quello raggiunto dalla barra delle azioni, non il button del menu) anche sui dispositivi che dispongono di un button Menu . Questo sembra molto più intuitivo per gli utenti che lanciarli in una list di menu separata che richiede all'utente di saltare da un'interazione touch (schermo) ad un'interazione basata sui pulsanti semplicemente perché il layout di ActionBar non può essere inserito sul bar.

Sull'emulatore posso impostare il valore "Hardware Back / Home Keys" su "no" e get questo effetto. Ho cercato un modo per fare questo nel codice per un dispositivo effettivo che dispone di un button di menu, ma non può finire uno. Qualcuno può aiutarmi?

  • Pinch Android per Zoom ImageView
  • Rimuovi lo stack dopo l'apertura dell'attività dal browser web per url "appname: //com.appname/"
  • Cordova: [Errore: installi il target Android: "android-21"
  • No ActionBar in PreferenceActivity dopo l'aggiornamento a Support Library v21
  • Pulsante indietro di Android e MediaController
  • Come faccio a aggiornare il layout di RecyclerView?
  • Aliasing di una risorsa di layout con lo stesso nome solo qualificatore di schermo diverso
  • Il widget Widget di Click e Broadcast non funziona
  • "UnsatisfiedLinkError" viene visualizzato quando "dynamic_cast" viene utilizzato in Android NDK
  • Indicazioni stradali per il mobile web dalla posizione corrente
  • Eccezione di livello superiore inatteso: java.lang.IllegalArgumentException: già aggiunto
  • come estrarre l'attributo di nome dall'arrays di stringhe?
  • 11 Solutions collect form web for “Come forzare l'uso del menu di overflow sui dispositivi con il button menu”

    EDIT: Modificato per rispondere alla situazione del button di menu fisico.

    Questo è in realtà impedito dal design. Secondo la sezione di compatibilità della Guida di progettazione di Android ,

    "… l'overflow dell'azione è disponibile dal menu hardware del menu. Le azioni che ne conseguono … vengono visualizzate nella parte inferiore dello schermo."

    Noterai nelle schermate, i telefoni con un button di menu fisico non dispongono di un menu di overflow in ActionBar. Ciò evita l'ambiguità per l'utente, essenzialmente avendo due pulsanti disponibili per aprire lo stesso menu.

    Per risolvere il problema della coerenza tra i dispositivi: in ultima analisi, è più importnte per l'esperienza dell'utente che l'applicazione si comport in modo coerente con each altra applicazione sullo stesso dispositivo, rispetto a quella che si comport in modo coerente con tutti i dispositivi.

    È anche ansible utilizzare questo piccolo hack qui:

    try { ViewConfiguration config = ViewConfiguration.get(this); Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); if (menuKeyField != null) { menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); } } catch (Exception ignored) { } 

    Buon posto per metterlo sarebbe il onCreate della tua class Applicazione.

    Forzerà l'App per mostrare il menu di overflow. Il button di menu continuerà a funzionare, ma aprirà il menu nell'angolo in alto a destra.

    [Modifica] Dato che è venuto più volte adesso: Questo hack funziona solo per l'ActionBar nativo introdotto in Android 3.0, non ActionBarSherlock. Quest'ultimo utilizza la propria logica interna per decidere se mostrare il menu di overflow. Se usi l'ABS, tutte le piattaforms <4.0 sono gestite da ABS e sono quindi sottoposte alla sua logica. Il hack functionrà ancora per tutti i dispositivi con Android 4.0 o versione successiva (puoi ignorare in modo sicuro Android 3.x, poiché non ci sono davvero delle compresse là fuori con un button di menu).

    Esiste una speciale Theme ForceOverflow che forza il menu in ABS, ma apperentemente verrà rimosso nelle versioni future per complicazioni .

    Io uso per risolvere il problema definendo il mio menu come questo (anche con l'icona ActionBarSherlock utilizzata nel mio esempio):

     <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/menu_overflow" android:icon="@drawable/abs__ic_menu_moreoverflow_normal_holo_light" android:orderInCategory="11111" android:showAsAction="always"> <menu> <item android:id="@+id/menu_overflow_item1" android:showAsAction="never" android:title="@string/overflow_item1_title"/> <item android:id="@+id/menu_overflow_item2" android:showAsAction="never" android:title="@string/overflow_item2_title"/> </menu> </item> </menu> 

    Lo ammetto che questo potrebbe richiedere un "overflow-management" manuale nel tuo xml, ma ho trovato questa soluzione utile.

    È inoltre ansible forzare il dispositivo per utilizzare il button HW per aprire il menu di overflow, nell'attività:

     private Menu mainMenu; @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO: init menu here... // then: mainMenu=menu; return true; } @Override public boolean onKeyUp(int keycode, KeyEvent e) { switch(keycode) { case KeyEvent.KEYCODE_MENU: if (mainMenu !=null) { mainMenu.performIdentifierAction(R.id.menu_overflow, 0); } } return super.onKeyUp(keycode, e); } 

    🙂

    Se si utilizza la barra delle azioni dalla libreria di supporto ( android.support.v7.app.ActionBar ), utilizzare quanto segue:

     <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yorapp="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/menu_overflow" android:icon="@drawable/icon" yourapp:showAsAction="always" android:title=""> <menu> <item android:id="@+id/item1" android:title="item1"/> <item android:id="@+id/item2" android:title="item2"/> </menu> </item> </menu> 

    Questo tipo di metodo è impedito dall'Android Developers Design System, ma ho trovato un modo per passarlo:

    Aggiungere questo nel file di menu XML:

     <item android:id="@+id/pick_action_provider" android:showAsAction="always" android:title="More" android:icon="@drawable/ic_action_overflow" android:actionProviderClass="com.example.AppPickActionProvider" /> 

    Quindi, crea una class denominata 'AppPickActionProvider' e copia il seguente codice:

      package com.example; import android.content.Context; import android.util.Log; import android.view.ActionProvider; import android.view.MenuItem; import android.view.MenuItem.OnMenuItemClickListener; import android.view.SubMenu; import android.view.View; public class AppPickActionProvider extends ActionProvider implements OnMenuItemClickListener { static final int LIST_LENGTH = 3; Context mContext; public AppPickActionProvider(Context context) { super(context); mContext = context; } @Override public View onCreateActionView() { Log.d(this.getClass().getSimpleName(), "onCreateActionView"); return null; } @Override public boolean onPerformDefaultAction() { Log.d(this.getClass().getSimpleName(), "onPerformDefaultAction"); return super.onPerformDefaultAction(); } @Override public boolean hasSubMenu() { Log.d(this.getClass().getSimpleName(), "hasSubMenu"); return true; } @Override public void onPrepareSubMenu(SubMenu subMenu) { Log.d(this.getClass().getSimpleName(), "onPrepareSubMenu"); subMenu.clear(); subMenu.add(0, 1, 1, "Item1") .setIcon(R.drawable.ic_action_home).setOnMenuItemClickListener(this); subMenu.add(0, 2, 1, "Item2") .setIcon(R.drawable.ic_action_downloads).setOnMenuItemClickListener(this); } @Override public boolean onMenuItemClick(MenuItem item) { switch(item.getItemId()) { case 1: // What will happen when the user presses the first menu item ( 'Item1' ) break; case 2: // What will happen when the user presses the second menu item ( 'Item2' ) break; } return true; } } 

    Beh, credo che Alexander Lucas ha fornito (sfortunatamente) una risposta corretta, quindi lo seggo come "corretto". La risposta alternativa che sto aggiungendo qui è semplicemente indicare a tutti i nuovi lettori di questo post nel blog Android Developers come una discussione piuttosto completa dell'argomento con alcuni suggerimenti specifici su come affrontare il codice durante la transizione dal livello pre-livello 11 al nuovo action bar.

    Credo ancora che sia stato un errore di progettazione non avere il button del menu si comport come un ridondante button "Action Overflow" nei dispositivi abilitati per il menu di menu come un modo migliore per passare l'esperienza utente ma la sua acqua sotto il ponte a questo punto.

    Non sono sicuro se questo è quello che stai cercando, ma ho creato un sottomenu all'interno del menu ActionBar e impostato l'icona in modo che corrisponda all'icona del menu Overflow. Anche se non si hanno oggetti inviati automaticamente ad esso (IE si deve scegliere quello che è sempre visibile e ciò che è sempre traboccato) mi sembra che questo approccio possa aiutarti.

    Nell'applicazione gmail fornita con ICS preinstallata, il button menu viene distriggersto quando si selezionano più elementi. Il menu di overflow è qui "forzato" per essere triggersto dall'utilizzo del button di overflow invece del button di menu fisico. Esiste un lib di 3rd party denominato ActionBarSherlock che consente di "forzare" il menu di overflow. Ma questo functionrà solo sul livello API 14 o inferiore (pre-ICS)

    Se si utilizza la barra degli strumenti , è ansible visualizzare l'overflow su tutte le versioni e tutti i dispositivi che ho provato su alcuni dispositivi 2.x.

    Scusa se questo problema è morto.

    Ecco cosa ho fatto per risolvere l'errore. Sono andato a layout e ho creato due che contenevano barre degli strumenti. Uno era un layout per la versione 8 di sdk e l'altro era per la versione sdk 21. Nella versione 8, ho usato la barra android.support.v7.widget.Tool mentre ho usato android.widget.Toolbar sul layout di sdk 21.

    Poi gonfierò la barra degli strumenti nella mia attività. Ho controllato la sdk per vedere se era 21 o superiore. Inflate quindi il layout corrispondente. Ciò obbliga il button hardware a mappare sulla barra degli strumenti effettivamente progettata.

    Per chiunque utilizzi la nuova Toolbar :

     private Toolbar mToolbar; @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); mToolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(mToolbar); ... } @Override public boolean onKeyUp(int keycode, KeyEvent e) { switch(keycode) { case KeyEvent.KEYCODE_MENU: mToolbar.showOverflowMenu(); return true; } return super.onKeyUp(keycode, e); } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.