android: CheckedTextView ne peut pas être vérifié?

Au départ, je voulais une coche où le texte est placé à gauche de la coche. Après la recherche sur ce site, j’ai trouvé la meilleure solution de contournement est Android: CheckedTextView? Cependant, j’ai découvert que la coche ne pouvait pas être modifiée manuellement par les utilisateurs. Est-ce par conception?

 

Vous voulez probablement utiliser un CheckBox normal (qui hérite de Button et donc de TextView ). CheckedTextView est conçu pour fonctionner avec des vues de liste. Exemple de mise en page CheckBox XML est ci-dessous:

  

Il est possible et assez simple de mettre en œuvre ce que vous recherchez. Oui, CheckedTextView est principalement utilisé pour avoir une seule vue Checkable dans la ligne d’un ListView , qui contrôle les états vérifiables de ses enfants à l’aide de choiceMode . Cependant, étant donné que CheckBox ne semble pas prendre en charge une case à cocher alignée à droite et que CheckedTextView est une case à cocher alignée à droite, il est logique de vouloir utiliser ce qui existe.

Étant donné que ListView contrôle l’état vérifié d’un élément de liste, le CheckedTextView lui-même ne répond pas aux événements de clic, et ne peut pas être cliqué ou focalisé par défaut. Il répond toutefois aux états pressés et focalisés, ce qui signifie qu’il peut recevoir des événements de focus et de clic et qu’il a l’air correct dans la mesure où une case à cocher doit apparaître. La seule chose qui manque, c’est qu’il ne bascule pas son état vérifié sur le clic. Par conséquent, un OnClickListener rapide qui appelle .toggle() vous donnera le résultat final que vous recherchez.

En résumé, vous avez besoin de 3 choses: clickable, focusable et onClickListener:

  CheckedTextView chkBox = (CheckedTextView) findViewById(R.id.CheckedTextView01); chkBox.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { ((CheckedTextView) v).toggle(); } }); 

et fichier de mise en page:

  

Vous pouvez utiliser et basculer CheckedTextView de la manière suivante:

Dans la mise en page:

  

Dans votre activité:

 public void toggle(View v) { CheckedTextView cView = (CheckedTextView) v.findViewById(R.id.cv_file_name); if (cView.isSelected()) { cView.setSelected(false); cView.setCheckMarkDrawable (R.drawable.btn_check_off); } else { cView.setSelected(true); cView.setCheckMarkDrawable (R.drawable.btn_check_on); } } 

Et n’oubliez pas de mettre des tirables. Je le reçois du SDK … \ android-sdk-windows \ plates-formes \ android-10 \ data \ res \ drawable-mdpi \

Cette disposition ressemble et se comporte de la même manière que CheckedTextView :

     

Seul un peu de travail supplémentaire consiste à définir un OnClickListener sur la vue racine et à appeler checkBox.toggle() sur le CheckBox .

Voici mon utilisation dans SingleChoiceDialog

1.select_dialog_singlechoice.xml

   

2.style.xml

  

3.ratio.xml

        

4.En getView de l’adaptateur

 CheckedTextView title = (CheckedTextView) convertView .findViewById(android.R.id.text1); title.setText(mItems[position]); title.setSelected(mCheckedItem == position ? true : false); title.setCheckMarkDrawable(position == mCheckedItem ? R.drawable.dot_selected : R.drawable.dot_normal); 

La réponse simple est use: la méthode isChecked() au lieu de isSelected() .

 CheckedTextView chkBox = (CheckedTextView) findViewById(R.id.CheckedTextView01); chkBox.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if(((CheckedTextView) v).isChecked()){ ((CheckedTextView) v).setChecked(false); }else{ ((CheckedTextView) v).setChecked(true); } } }); 

et obtenez le statut en utilisant la méthode view.isChecked() .

Si vous souhaitez un contrôle plus précis de l’étiquette et de la case à cocher, vous pouvez également utiliser RelativeLayout et l’atsortingbut android: layout_alignParentRight:

     

Vous pouvez ensuite ajuster la marge / etc de la vue texte et de la case à cocher en fonction de vos besoins.