70 votes

Élément de menu vérifiable Android

J'ai la disposition de menu suivante dans mon application Android :

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

Le problème est que le deuxième élément du menu ne semble pas être "vérifiable" lorsque j'exécute mon application dans l'émulateur Android. Il devrait y avoir une coche verte autour de l'élément, non ? Pour indiquer qu'il est vérifiable.

Est-ce que je fais quelque chose de mal ?

2 votes

Il suffit de définir non pas Android:checkable à "true", mais Android:checked !

1voto

Rowan Berry Points 18

Je réponds parce que les réponses ici semblent longues et alambiquées J'ai du code Kotlin exact ici

Remplacez votre activité en haut et remplacez la fonction onMenuItemClick par une fonction qui gère le clic du bouton pour ouvrir le menu.

Disposez d'un tableau ou d'une liste qui contient la valeur vérifiée et active la vérification lorsque le menu est recréé.

Note : Ce code ne garde pas le menu ouvert, il s'assure seulement que les éléments cochés restent cochés. J'ai noté qu'il y a beaucoup de solutions à cela sur stack overflow, alors jetez-y un œil si c'est ce que vous désirez.

class exampleActivity : AppCompatActivity(), PopupMenu.OnMenuItemClickListener {
   private var checkChecked = arrayListOf(false,false)
   //some code

  fun clickBTN(v: View){
        val popup = PopupMenu(this,v)
        popup.setOnMenuItemClickListener(this)
        popup.inflate(R.menu.yourmenufilename)
        //assuming you have 2 or more menu items
        popup.menu[0].isChecked = checkChecked[0]
        popup.menu[1].isChecked = checkChecked[1]
        popup.show()
  }

  override fun onMenuItemClick(item: MenuItem?): Boolean {
     when(item?.itemID){
        R.id.item0 -> {
                item.isChecked = !item.isChecked
                checkChecked[0] = item.isChecked
                return true
        }
        R.id.item1 -> {
                item.isChecked = !item.isChecked
                checkChecked[1] = item.isChecked
                return true
        }
  }
}

Bien sûr, en XML, vous devriez avoir configuré votre bouton et votre menu. Un exemple de menu est ici

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/item0"
        android:title="@string/hi"
        android:checkable="true"/>
    <item android:id="@+id/item1"
        android:title="@string/yo"
        android:checkable="true"/>
</menu>

0voto

sham Points 105

Cela dépend peut-être du thème, mais mon menu n'affiche pas de case à cocher. J'ai trouvé ce :

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

0voto

Lins Louis Points 11

Pour ajouter des éléments de menu de manière programmée,

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

0voto

user8903954 Points 1

J'ai deux éléments dans le menu et définis comme vérifiables dans menu.xml comme ci-dessous

    <item
        android:id="@+id/A"
        android:title="A"
        app:showAsAction="never"
        android:checkable="true"/>
    <item
        android:id="@+id/B"
        android:title="B"
        app:showAsAction="never"
        android:checkable="true"/> 

et la logique pour les cases à cocher du menu est ci-dessous.

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {

    switch (item.getItemId()) {
        case R.id.A:
           //logic goes here

            if(item.isChecked())
            {
             //logic is it is checked
             item.setChecked(false);
            }
            else
            {
               //logic is it is not checked
                item.setChecked(true);
            }
            return true;
        case R.id.B:
         //logic for second checkbox goes here

            if(item.isChecked())
            {
             //logic is it is checked
                item.setChecked(false);
            }
            else
            {
             //logic is it is not checked
                item.setChecked(true);
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X