Au départ, je voulais une coche où le texte est placé à gauche de la coche. Après avoir recherché sur ce site, j'ai découvert que la meilleure solution de contournement est Android: CheckedTextView? Cependant, j'ai découvert que la coche ne peut pas être modifiée manuellement par les utilisateurs. Est-ce par conception?
<CheckedTextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/autoupdatecheckboxview"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:gravity="center_vertical"
Android:checkMark="?android:attr/listChoiceIndicatorMultiple"
Android:paddingLeft="6dip"
Android:paddingRight="6dip"
Android:text="Pop up a message when new data available"
Android:typeface="sans" Android:textSize="16dip"/>
Vous voudrez probablement simplement utiliser un régulier CheckBox
(qui hérite de Button
et donc TextView
). CheckedTextView
est conçu pour fonctionner avec les vues de liste. Exemple CheckBox
disposition XML est ci-dessous:
<CheckBox
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="Pop up a message when new data available"
Android:textSize="16dip" />
Il est possible et quelque peu 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, puisque CheckBox ne semble pas prendre en charge une case à cocher alignée à droite, et CheckedTextView is une case à cocher alignée à droite, il est logique de vouloir utiliser ce qui est là.
É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 n'est pas cliquable ou focalisable par défaut. Cependant, il répond aux états pressés et focalisés - cela signifie qu'il peut recevoir des événements de focus et de clic, et semble correct pour autant qu'une case à cocher devrait apparaître. La seule chose qui manque, c'est qu'il ne bascule pas son état vérifié au 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: cliquable, focalisable 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:
<CheckedTextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/CheckedTextView01"
Android:checked="true"
Android:clickable="true"
Android:focusable="true"
Android:text="Label on Left Side of Checkbox."
/>
Vous pouvez utiliser et basculer CheckedTextView de la manière suivante:
Dans la mise en page:
<CheckedTextView
Android:id="@+id/cv_id"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="Some text here"
Android:textSize="18sp"
Android:gravity="center_vertical"
Android:clickable="true"
Android:checkMark="@drawable/btn_check_off"
Android:focusable="true"
Android:checked="false"
Android:onClick="toggle"/>
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 tiroirs. Je l'obtiens du SDK ...\Android-sdk-windows\plates-formes\Android-10\data\res\drawable-mdpi \
la réponse simple est d'utiliser 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 obtenir le statut en utilisant la méthode view.isChecked()
.
Voici mon utilisation dans SingleChoiceDialog
1.select_dialog_singlechoice.xml
<?xml version="1.0" encoding="UTF-8"?>
<CheckedTextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@Android:id/text1"
style="@style/PopupSelectList"
Android:checkMark="@drawable/radio"
Android:ellipsize="Marquee"
Android:gravity="center_vertical"
Android:paddingLeft="12.0dip"
Android:paddingRight="10.0dip" />
2.style.xml
<style name="PopupSelectList">
<item name="Android:textSize">16.0sp</item>
<item name="Android:textColor">@color/white</item>
<item name="Android:background">@drawable/list_item_selector</item>
<item name="Android:layout_width">fill_parent</item>
<item name="Android:layout_height">wrap_content</item>
<item name="Android:minHeight">@dimen/dialog_select_height</item>
</style>
3.ratio.xml
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/dot_selected" Android:state_checked="true" Android:state_window_focused="false"/>
<item Android:drawable="@drawable/dot_normal" Android:state_checked="false" Android:state_window_focused="false"/>
<item Android:drawable="@drawable/dot_normal" Android:state_checked="false"/>
<item Android:drawable="@drawable/dot_selected" Android:state_checked="true"/>
</selector>
4.Dans le 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);
Cette disposition ressemble et se comporte de la même manière que CheckedTextView
:
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="?attr/dropdownListPreferredItemHeight"
Android:gravity="center_vertical" >
<TextView
Android:id="@Android:id/text1"
style="?android:attr/spinnerDropDownItemStyle"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:ellipsize="Marquee"
Android:singleLine="true" />
<CheckBox
Android:id="@Android:id/checkbox"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:clickable="false"
Android:duplicateParentState="true"
Android:focusable="false" />
</LinearLayout>
Seul un travail supplémentaire consiste à définir un OnClickListener
sur la vue racine et à appeler checkBox.toggle()
sur le CheckBox
.
Si vous souhaitez un contrôle plus fin sur l'étiquette et la case à cocher, une autre alternative consiste à utiliser RelativeLayout et l'attribut Android: layout_alignParentRight:
<RelativeLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content">
<TextView
Android:id="@+id/my_checkbox_label"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="my checkbox label" />
<CheckBox
Android:id="@+id/my_checkbox"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentRight="true" />
</RelativeLayout>
vous pouvez ensuite ajuster la marge/etc. de la vue de texte et de la case à cocher en fonction de vos besoins.