2011-11-16 14 views
13

così sto cercando di ottenere la mia voce di menu, che è mostrare sulla barra delle azioni di comportarsi come un'opzione del menu controllabile. La prima parte funziona, il che significa che è controllabile e quando lo preme, e setto in codice il setChecked (vero) funziona. Ma ciò che non funziona è la parte visiva. Non vi è alcun cambiamento nel modo in cui una voce di menu appare sulla barra delle azioni in stati controllati e non selezionati? Ho provato a utilizzare invalidateOptionsMenu() ma questo non fa il lavoro, e non solo quello, con quella linea nel mio codice non posso uscire dallo stato controllato?!? Quello che succede è che invalidare OptionsMenu() giunzioni per disinserire lo stato controllato e finire 'looping', o ad ogni pressione di quella voce del menu torno alla parte non controllata del codice dove viene controllato e con invalidare si ottiene incontrollato immagino ...La voce di menu controllabile della barra delle azioni di Android non funziona/mostra correttamente?

Ecco il codice dal mio file XML per il menu:

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/lenslist_menu_add" 
     android:showAsAction="always" 
     android:title="@string/add"/> 
    <item android:id="@+id/lenslist_menu_delete" 
     android:showAsAction="always" 
     android:checkable="true" 
     android:title="@string/delete"/> 
</menu> 

E qui è il codice Java:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // TODO Auto-generated method stub 
    switch (item.getItemId()) { 
    case R.id.lenslist_menu_add: 

     return true; 
    case R.id.lenslist_menu_delete: 
     if (item.isChecked() == true) { 
      item.setChecked(false); 
      deleteMode = false; 
      lensAdapter.setDeleteMode(false); 
     } else { 
      item.setChecked(true); 
      deleteMode = true; 
      lensAdapter.setDeleteMode(true); 
     } 
     lensAdapter.notifyDataSetChanged(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

Grazie!

risposta

30

Le voci verificabili vengono visualizzate solo nei sottomenu o nei menu di scelta rapida.

Si stanno utilizzando come voci del menu principale, quindi non funzionerà.

FONTE: Scarica le demo API, e aprire l'ApiDemos file/res/menu/checkable.xml, vedrete come un commento sulla linea 13. Non so perché non menzionano questo riferimento nella documentazione per sviluppatori

con commento .: http://alvinalexander.com/java/jwarehouse/android-examples/platforms/android-2/samples/ApiDemos/res/menu/checkable.xml.shtml

+0

Dov'è quella citazione da? –

+0

È possibile trovare un commento nelle demo Api: ApiDemos \ res \ menu \ checkable.xml, non è stato possibile trovarlo nella documentazione per sviluppatori – Entreco

4

la soluzione migliore è quella di impostare il actionLayout del <Item> ad un CheckBox. Questa soluzione offre una casella di controllo dall'aspetto nativo (con animazioni di materiale ecc.), Con un carattere che corrisponde agli altri elementi e funziona sia come azione che nel sottomenu.

  1. creare un nuovo layout chiamato action_checkbox.html:
<?xml version="1.0" encoding="utf-8"?> 
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:paddingStart="8dp" 
      android:paddingEnd="8dp" 
      android:checked="false" 
      android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Menu" 
      android:id="@+id/action_item_checkbox" 
    /> 
  1. Impostare il <Item> come questo. Si noti che è necessario il Checkable e Checked ancora nel caso in cui è mostrato in un sottomenu (nel qual caso il actionLayout viene ignorato.
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> 
    <item android:id="@+id/menu_action_logging" 
      android:title="@string/action_logging" 
      android:orderInCategory="100" 
      android:showAsAction="always" 
      android:checkable="true" 
      android:checked="false" 
      android:actionLayout="@layout/action_checkbox" 
     /> 
</menu> 
  1. Nella tua codice, quando viene creato il menu abbiamo bisogno di a) impostare il titolo della casella di controllo in modo che corrisponda al titolo della voce di menu, b) ripristinare lo stato verificato di entrambi i menu controllabili, e la nostra casella di controllo extra ec) aggiungere un onClicked() ascoltatore per la nostra casella di controllo extra. In questo codice sto persistendo lo stato della casella di controllo in un RetainedFragment.
// Set the check state of an actionbar item that has its actionLayout set to a layout 
    // containing a checkbox with the ID action_item_checkbox. 
    private void setActionBarCheckboxChecked(MenuItem it, boolean checked) 
    { 
     if (it == null) 
      return; 

     it.setChecked(checked); 

     // Since it is shown as an action, and not in the sub-menu we have to manually set the icon too. 
     CheckBox cb = (CheckBox)it.getActionView().findViewById(R.id.action_item_checkbox); 
     if (cb != null) 
      cb.setChecked(checked); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 
    { 
     inflater.inflate(R.menu.menu_main, menu); 
     super.onCreateOptionsMenu(menu, inflater); 

     // Restore the check state e.g. if the device has been rotated. 
     final MenuItem logItem = menu.findItem(R.id.menu_action_logging); 
     setActionBarCheckboxChecked(logItem, mRetainedFragment.getLoggingEnabled()); 

     CheckBox cb = (CheckBox)logItem.getActionView().findViewById(R.id.action_item_checkbox); 
     if (cb != null) 
     { 
      // Set the text to match the item. 
      cb.setText(logItem.getTitle()); 
      // Add the onClickListener because the CheckBox doesn't automatically trigger onOptionsItemSelected. 
      cb.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        onOptionsItemSelected(logItem); 
       } 
      }); 
     } 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.menu_action_logging: 
       // Toggle the checkbox. 
       setActionBarCheckboxChecked(item, !item.isChecked()); 

       // Do whatever you want to do when the checkbox is changed. 
       mRetainedFragment.setLoggingEnabled(item.isChecked()); 
       return true; 
      default: 
       break; 
     } 

     return false; 
    } 
+0

Che cos'è mRetainedFragment? –

+0

È proprio quello che volevo fare il mio codice. Sostituiscilo con quello che vuoi che il tuo codice faccia quando la casella di controllo è attiva. – Timmmm

+0

Grazie. Ho risolto aggiungendo layout personalizzato nella barra delle azioni. Lavoro perfetto –

5

O semplicemente fai da te

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    menu.findItem(R.id.item1).setIcon(menu_checked?R.drawable.menu_ico_checked:R.drawable.menu_ico_unchecked); 
    return super.onPrepareOptionsMenu(menu); 
} 

e in onOptionsItemSelected fare:

.... 
menu_checked=!menu_checked; 
invalidateOptionsMenu(); 
+0

Vorrei votarti mille volte se posso – Rasel

Problemi correlati