2014-07-12 14 views
6

Ho questo semplice PopupMenu, ma quando clicco su un oggetto, l'oggetto non viene controllato. Perché?Elemento controllabile Android PopupMenu non controlla

Nella documentazione è: Le voci di menu nel menu icone (dal menu opzioni) non possono visualizzare una casella di controllo o un pulsante di opzione. Pulsante Radio sta mostrando, ma solo stato non sta cambiando ...

Java

public void showSortPopup() { 
    View menuItemView = findViewById(R.id.action_sort); 
    PopupMenu popup = new PopupMenu(this, menuItemView); 
    popup.inflate(R.menu.sort); 
    popup.getMenu().findItem(R.id.sort_def).setChecked(true); 
    popup.setOnMenuItemClickListener(new OnMenuItemClickListener() { 

     @Override 
     public boolean onMenuItemClick(MenuItem item) { 

      switch (item.getItemId()) { 
       case R.id.sort_def: 
        sortOrder = CardCursorContract.CardCursor.DEFAULT_SORT; 
        mCardsFragment.setSortOrder(sortOrder); 
        savePref(); 
        if (item.isChecked()) item.setChecked(false); 
        else item.setChecked(true); 
        break; 
       case R.id.sort_asc: 
        sortOrder = CardCursorContract.CardCursor.ALPHABETICAL_ASC_SORT; 
        mCardsFragment.setSortOrder(sortOrder); 
        savePref(); 
        if (item.isChecked()) item.setChecked(false); 
        else item.setChecked(true); 
        break; 
       case R.id.sort_desc: 
        sortOrder = CardCursorContract.CardCursor.ALPHABETICAL_DESC_SORT; 
        mCardsFragment.setSortOrder(sortOrder); 
        savePref(); 
        if (item.isChecked()) item.setChecked(false); 
        else item.setChecked(true); 
        break; 
       default: 
        break; 
      } 
      return false; 
     } 
    }); 
    popup.show(); 
} 

XML File

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<group android:checkableBehavior="single"> 
<item android:id="@+id/sort_def" 
     android:title="@string/action_sort_def" 
     android:orderInCategory="1" 
     android:showAsAction="always" /> 

<item android:id="@+id/sort_asc" 
     android:title="@string/action_sort_name" 
     android:orderInCategory="2" 
     android:showAsAction="always" /> 

<item 
     android:id="@+id/sort_desc" 
     android:title="@string/action_sort_name_desc" 
     android:orderInCategory="3" 
     android:showAsAction="always"/> 
</group> 

schermo

enter image description here

risposta

2

Prima di tutto è possibile semplificare la dichiarazione se selezionato altro per

item.setChecked(!item.isChecked()) 

Quello in modo che lo cambi sempre da vero → falso e viceversa.

Ma il problema sta nel fatto che si dispone di radiobutton, ciò che la dichiarazione di cui sopra è rende il group controllato, ma quello che vuoi è quello di avere il item controllato.

Per ottenere il comportamento desiderato, è possibile utilizzare item.getSubmMenu() e quindi utilizzare il metodo setChecked sul particolare sottomenuem desiderato.

Ad esempio:

//This will refer to the default, ascending or descending item. 
MenuItem subMenuItem = item.getSubMenu().getItem(INDEX_OF_ITEM); 
//Check or uncheck it. 
subMenuItem.setChecked(!subMenuItem.isChecked()); 
0

** Swap queste linee in ogni caso **

if (item.isChecked()) item.setChecked(false); 
        else item.setChecked(true); 

Per

if (item.isChecked()) item.setChecked(true); 
        else item.setChecked(false); 
+0

Non ha senso, ma ho provato e ancora lo fa non funziona ... – Tomas

Problemi correlati