2011-06-04 3 views
47

je la mise en page de menu suivant dans mon application Android:Android Vérifiable Menu Item

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/item1" 
      android:titleCondensed="Options" 
      android:title="Highlight Options" 
      android:icon="@android:drawable/ic_menu_preferences" /> 

    <item android:id="@+id/item2" 
     android:titleCondensed="Persist" 
     android:title="Persist" 
     android:icon="@android:drawable/ic_menu_preferences" 
     android:checkable="true" /> 
</menu> 

Mon problème est que le deuxième élément de menu ne semble pas être « checkable » quand je lance mon application dans l'Android émulateur. Il devrait y avoir une coche verte sur l'objet, non? Pour indiquer que c'est vérifiable.

Est-ce que je fais quelque chose de mal?

+2

Vous avez juste besoin de ne pas définir android: checkable à "true", mais Android :vérifié ! –

Répondre

70

mise en page ressemble à droite. Mais vous devez cocher et décocher l'élément de menu dans le code.

De l'documentation:

Lorsqu'un élément est sélectionné checkable, le système appelle votre méthode de rappel de l'élément sélectionné respectif (comme onOptionsItemSelected()). C'est ici que vous devez définir l'état de la case à cocher, car une case à cocher ou un bouton radio ne change pas automatiquement son état. Vous pouvez interroger l'état actuel de l'élément (tel qu'il était avant que l'utilisateur ne le sélectionne) avec isChecked(), puis définir l'état coché avec setChecked().

+0

Juste au-dessus de cette citation, il est dit 'Vous pouvez appliquer un état coché par défaut à un élément en utilisant l'attribut android: checked de l'élément et le changer en code avec la méthode setChecked(). –

+1

Je ne vois pas ce qui ne va pas. Dans cette citation a déclaré qu'il peut être appliqué l'état de vérification par défaut et l'état de vérification peut être changé. Dans ma citation a déclaré que l'état de vérification doit changer manuellement par le code. –

+1

Mon mauvais sur ceci .. J'étais confus par l'état initial des articles de menu, s'il est nécessaire d'être mis du code ou pas. Il semble que l'état initial vérifié peut être défini à partir de xml, et après peut être modifié à volonté à partir du code, est-ce correct? –

26

Envelopper les item s dans un élément group, comme celui-ci:

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <group android:checkableBehavior="all"> 
     <item android:id="@+id/item1" 
       android:titleCondensed="Options" 
       android:title="Highlight Options" 
       android:icon="@android:drawable/ic_menu_preferences"> 
     </item> 
     <item android:id="@+id/item2" 
       android:titleCondensed="Persist" 
       android:title="Persist" 
       android:icon="@android:drawable/ic_menu_preferences" 
       android:checkable="true"> 
     </item> 
    </group> 
</menu> 

De l'Android docs:

L'attribut android: checkableBehavior accepte soit:

unique - Un seul élément à partir du groupe peut être cochée (boutons radio)

tous - Tous les éléments peuvent être contrôlés (cases à cocher)

Aucun - Aucun article ne checkable

0

Cela peut dépendre du thème mais mon menu n'affiche pas de case à cocher. J'ai trouvé this:

Remarque: Les éléments de menu dans le menu d'icônes ne peuvent pas afficher une case à cocher ou le bouton radio . Si vous choisissez de rendre les éléments du menu Icône vérifiables, alors vous devez indiquer personnellement l'état en échangeant l'icône et/ou le texte chaque fois que l'état change entre activé et désactivé.

9

Vous pouvez créer un élément de menu checkable en réglant le actionViewClass à un widget checkable comme android.widget.CheckBox

res/menu/menu_with_checkable_menu_item.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item 
     android:id="@+id/action_favorite" 
     android:checkable="true" 
     android:title="@string/action_favorite" 
     app:actionViewClass="android.widget.CheckBox" 
     app:showAsAction="ifRoom|withText" /> 
</menu> 

Et vous pouvez même pouvez définir le style à être une star checkable si vous définissez actionLayout à une mise en page avec un style android.widget.CheckBox

res/layout /action_layout_styled_checkbox.xml

<CheckBox xmlns:android="http://schemas.android.com/apk/res/android" 
    style="?android:attr/starStyle" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

res/menu/menu_with_checkable_star_menu_item.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item 
     android:id="@+id/action_favorites" 
     android:checkable="true" 
     android:title="@string/action_favorites" 
     app:actionLayout="@layout/action_layout_styled_checkbox" 
     app:showAsAction="ifRoom|withText" /> 
</menu> 

Pour définir la valeur

menuItem.setChecked(true/false); 

Pour obtenir la valeur

menuItem.isChecked() 

Cast MenuItem à C heckBox

CheckBox checkBox= (CheckBox) menuItem.getActionView(); 
0

pour ajouter des éléments de menu Programmatically,

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    menu.add("Item1").setActionView(R.layout.action_layout_checkbox).setCheckable(true); 
    return super.onCreateOptionsMenu(menu); 
} 

res/layout /action_layout_checkbox.xml

<CheckBox xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" />