2014-07-12 5 views
6

Ich habe dieses einfache PopupMenu, aber wenn ich auf ein Element klicke, wird das Element nicht überprüft. Warum?Android PopupMenu checkable Element überprüft nicht

In der Dokumentation ist: Menüelemente im Symbolmenü (aus dem Optionsmenü) können kein Kontrollkästchen oder Optionsfeld anzeigen. Radiotaste angezeigt wird, aber nur Zustand ändert sich nicht ...

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-Datei

<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> 

Bildschirm

enter image description here

Tauschen 10

Antwort

2

Zunächst einmal Sie, wenn geprüft else-Anweisung zu

item.setChecked(!item.isChecked()) 

vereinfachen kann man erkennen, so wird es immer von wahr → falsch und umgekehrt umschalten.

Aber das Problem liegt in der Tatsache, dass Sie radiobuttons haben, was die obige Aussage macht die group überprüft, aber was Sie wollen, ist die item überprüft haben.

Um das gewünschte Verhalten zu erhalten, können Sie item.getSubmMenu() verwenden und dann die setChecked-Methode für das gewünschte subMenuItem verwenden.

Zum Beispiel:

//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

** Diese Zeilen in jedem Fall **

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

Um

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

Es macht keinen Sinn, aber ich versuchte es und immer noch funktioniert es nicht ... – Tomas