2012-04-03 12 views
15

Im utilizzando la libreria di compatibilità della barra delle azioni. Sto cercando di aprire il menu delle opzioni da un pulsante con la funzione openOptionsMenu() ma non fa nulla.La funzione openOptionsMenu non funziona in ICS?

Il menu viene visualizzato come al solito quando si preme il tasto menu sul telefono. Cosa c'è di sbagliato qui?

public class ReadActivity extends ActionBarActivity { 

    ... 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     boolean value; 
     MenuInflater menuInflater = getMenuInflater(); 
     menuInflater.inflate(R.menu.read, menu); 
     value = super.onCreateOptionsMenu(menu); 

     if (Helper.SupportsNewApi()) { 
      getActionBar().hide(); 
     } else { 
      ((View) ((LinearLayout) findViewById(R.id.actionbar_compat)) 
        .getParent()).setVisibility(View.GONE); 
     } 

     return value; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      finish(); 
      break; 
     case R.id.menu_search: 
      // Toast.makeText(this, "Tapped search", Toast.LENGTH_SHORT).show(); 
      break; 
     case R.id.menu_bookmark: 
      // selectText(); 
      // setFullScreen(false); 
      break; 
     case R.id.menu_day_night_mode: 
      break; 
     case R.id.menu_settings: 
      break; 
     case R.id.menu_zoom_in: 
      showOverlay(false); 
      break; 
     case R.id.menu_zoom_out: 
      showOverlay(false); 
      break; 
     case R.id.menu_table_of_contents: 
      Intent tocIntent = new Intent(this, TocActivity.class); 
      int GET_SECTION_REFERENCE = 1; 
      startActivityForResult(tocIntent, GET_SECTION_REFERENCE); 
      break; 
     case R.id.menu_overflow: 
      Toast.makeText(this, "Tapped overflow", Toast.LENGTH_SHORT).show(); 

      //closeOptionsMenu(); 
      openOptionsMenu(); //tried the below aswell, no results 
      //getWindow().openPanel(Window.FEATURE_OPTIONS_PANEL, null); 
      break; 
     } 
     return super.onOptionsItemSelected(item); 
    } 


    @Override //disable volume buttons 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (!menuShown && (keyCode == 25 || keyCode == 24)) { 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     Log.d(tag, "Keycode is = "+keyCode); 
     if (keyCode == 82) { 
      if (!menuShown) { 
       //openOptionsMenu(); 
       showOverlay(true); 
      } else { 
       showOverlay(false); 
      } 


        //don't want it to open when pressing menu 
      return true; 
     } else if (keyCode == 4 && menuShown) { 
      showOverlay(false); 
      return true; 
     } else if (keyCode == 25 && !menuShown) { 
      prevPage(); 
      return true; 
     } else if (keyCode == 24 && !menuShown) { 
      nextPage(); 
      return true; 
     } 

     return super.onKeyUp(keyCode, event); 
    } 

} 
+0

è possibile incollare il codice –

+0

sicuro, la sua bella enorme tho ... – Richard

+0

questo post [http://stackoverflow.com/questions/18937711/openoptionsmenu-not-working-with-actionbarsherlock-custom-submenu][1] è lavoro per me. [1]: http://stackoverflow.com/questions/18937711/openoptionsmenu-not-working-with-actionbarsherlock-custom-submenu –

risposta

4

io non sono sicuro di come rilevante è, ma this post sul forum ho trovato sembra essere il answerring stessa domanda che hai

Spero che questo post sia abbastanza pertinente per risolvere il tuo problema.

Buona fortuna!

+1

Come ha risolto questo problema? Non credo che sia davvero correlato. – htafoya

+6

È correlato, ma le risposte dovrebbero contenere una risposta, non solo un collegamento a una risposta su un altro sito. – mhsmith

+2

Nel caso in cui qualcuno stia ancora cercando questa è la vera risposta su quel post del forum "Forse tu, sul team di Android, dovresti creare un'API coerente e frizzante che funzioni su tutti i dispositivi in ​​modo che non possiamo spararci nella FOOT ogni volta che rilasci e cambi comportamento o aggiungere qualcosa di assolutamente nuovo di punto in bianco. " – dipu

0

Vuoi dire che vuoi mostrare un pulsante sul lato destro della barra delle azioni?

Ecco come ho fatto mia:

res/menu/main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:id="@+id/menu_share" 
    android:title="Logout" 
    android:icon="@android:drawable/ic_lock_power_off" 
    android:orderInCategory="1" 
    android:showAsAction="always" /> 
</menu> 

Attività
1) prendere atto della ActionBarActivity; 2) MenuInflater in onCreateOptionsMenu 3) onOptionsItemsSelected (credo dovete restituire super.onOptionsItemSelected (voce))

public class BaseActivity extends ActionBarActivity { 
    .... 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main, menu); 

    return true; 
} 
.... 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
    case R.id.menu_share: 


     //Do something 
     break; 
    } 

    return super.onOptionsItemSelected(item); 
} 
+0

No l'ActionBar e il menu è gonfiato e ha aggiunto correttamente. È la funzione'openOptionsMenu() 'chiamata da un pulsante che non fa nulla! – Richard

2

android: targetSdkVersion = "10" in manifest mi ha aiutato. openOptionsMenu() funziona come previsto ora su ICS +. Inoltre, viene visualizzato il pulsante di menu "overflow" nella parte inferiore dello schermo (sul pannello dei pulsanti del dispositivo).

ps: utilizzo il tema NoTitleBar (NoActionBar per sdk 11 e successivi) + ViewPagerIndicator di Jake Wharton.

+0

Ha funzionato anche per me, grazie! –

9

Per far luce su questo triste sviluppo di Google. Ovviamente Google desidera che tutti abbraccino la nuova ActionBar. Avrebbero potuto raggiungere questo risultato rendendo l'ActionBar più facile da usare rispetto al vecchio sistema di menu. Tuttavia, non è così che hanno pianificato la transizione. No, pensavano che avrebbe avuto senso per i programmatori harras rendendo i vecchi menu impossibili da usare ma senza fornire una adeguata compatibilità con le versioni precedenti.

Di seguito è riportato il codice preso da com.android.internal.policy.impl, che dovrebbe creare il pannello menu Opzioni. Come vedi, il codice si rifiuta semplicemente di creare un pannello di opzioni. Anche se, ovviamente, l'abilità è lì. Quindi, per rispondere alla tua domanda: dimenticala, Google non vuole che tu usi più quelPannello di opzioni.

// Don't open an options panel for honeycomb apps on xlarge devices. 
// (The app should be using an action bar for menu items.) 
if (st.featureId == FEATURE_OPTIONS_PANEL) { 
      Context context = getContext(); 
      Configuration config = context.getResources().getConfiguration(); 
      boolean isXLarge = (config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 
        Configuration.SCREENLAYOUT_SIZE_XLARGE; 
      boolean isHoneycombApp = context.getApplicationInfo().targetSdkVersion >= 
        android.os.Build.VERSION_CODES.HONEYCOMB; 

      if (isXLarge && isHoneycombApp) { 
       return; 
      } 
     } 
+1

Sembra ancora una volta con Google che l'usabilità è la scusa, ma non l'agenda. Ben fatto per scavare e chiarirci. –

+0

Action Bar è perfettamente facile da usare, il problema è che alcuni di noi hanno ragioni perfettamente legittime per non usarlo ei menu hanno funzionato bene per noi prima. –

31

ho avuto lo stesso problema cercando di andare in giro questa cosa openOptionsMenu su un app che stavo facendo che dovrebbe funzionare su Android 1.6 e superiori. Seguendo la risposta di Werner Van Belle ho raggiunto la conclusione che potremmo ottenere una soluzione alternativa per risolvere il problema. Così mi è venuto in mente il seguente codice, è sempre bello quando le persone non contrassegnano un metodo come finale, quindi possiamo sempre sostituirlo. È perfetto se non vuoi rinunciare a indirizzare la tua app all'ultima API (android: targetSdkVersion = "17"). Spero che vi piaccia.:)

@Override 
public void openOptionsMenu() { 

    Configuration config = getResources().getConfiguration(); 

    if((config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) 
      > Configuration.SCREENLAYOUT_SIZE_LARGE) { 

     int originalScreenLayout = config.screenLayout; 
     config.screenLayout = Configuration.SCREENLAYOUT_SIZE_LARGE; 
     super.openOptionsMenu(); 
     config.screenLayout = originalScreenLayout; 

    } else { 
     super.openOptionsMenu(); 
    } 
} 
+1

fantastico! Funziona! Grazie – Lisitso

+1

È terribile! È anche l'unica soluzione che funziona. Grazie! – benkc

+0

Questo non funziona per la mia app su un'API di targeting per dispositivo 3.2. Al clic di un pulsante, chiamo openOptionsMenu() e il metodo nella risposta viene eseguito. Ma ancora non ho il menu Opzioni. Mi chiedo come funzioni per i commentatori precedenti. Mi sto perdendo qualcosa?È necessario sovrascrivere qualsiasi altro metodo (onCreateOptionsMenu, onPrepareOptionsMenu)? – MediumOne

2

Questo ha funzionato per me, il mio codice è abbastanza simile al tuo, e quello che voglio fare è da un pulsante nella barra delle operazioni, aprire il menu di overflow:

public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.menu_home_about: 
      dialog = new Dialog(this); 
      dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
      dialog.setContentView(R.layout.customdialog); 
      dialog.show(); 
      break; 

      default: 

     case R.id.menu_home_refresh: 
      updateLists(true); 
      break; 

     case R.id.menu_home_menu: 
      new Handler().postDelayed(new Runnable() { 
       public void run() {     
        openOptionsMenu();   
       } 
      }, 0); 
      return true; 

     } 
     return false; 
    } 
+0

Ha funzionato anche per me. Molte molte grazie! – Sebastiano

4

Non riesco a capire l'utilizzo del pulsante Menu di blocco forzato. Tuttavia, il seguente trucco mi ha aiutato a mostrare un menu su tipi "limitati" di dispositivi.

Prima di tutto è necessario definire, indipendentemente dal fatto che richiediamo o meno il seguente trucco.

boolean requireDirtyMenuButtonHack = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && (activity.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_XLARGE) > 0; 

Poi:

protected final OnClickListener mMenuButtonClickListener = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     if (requireDirtyMenuButtonHack) { 
      Configuration config = getContext().getResources().getConfiguration(); 
      config.screenLayout &= ~Configuration.SCREENLAYOUT_SIZE_XLARGE; 
      config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_LARGE; 
     } 

     getActivity().openOptionsMenu(); 
    } 
}; 

Non dimenticare di pulizia! (Non so se è neccessary, ma meglio per giocare genere)

public void onPrepareOptionsMenu(Menu menu) { 
    if (requireDirtyMenuButtonHack) { 
     Configuration config = getContext().getResources().getConfiguration(); 
     config.screenLayout &= ~Configuration.SCREENLAYOUT_SIZE_LARGE; 
     config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_XLARGE; 
    } 

    //do the preparing... 
} 
0

Se si utilizza la barra degli strumenti personalizzata, si può provare:

toolBar.showOverflowMenu(); 
Problemi correlati