2010-04-13 7 views
38

Initialement, je voulais une coche où le texte est placé sur la gauche de la coche. Après avoir cherché sur ce site, j'ai trouvé 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?android: CheckedTextView ne peut pas être vérifié?

<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"/> 
+0

Alors CheckedTextView censé être nommé comme ListCheckedTextView? goddamn google –

Répondre

29

Vous voulez probablement simplement utiliser un CheckBox régulier (qui hérite de Button et donc TextView). CheckedTextView est conçu pour fonctionner avec les vues de liste. Exemple CheckBox XML de mise en page 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" /> 
119

Il est possible, et assez simple à mettre en œuvre ce que vous recherchez. Oui, CheckedTextView est utilisé principalement pour avoir une seule vue Checkable dans la ligne d'un ListView, qui contrôle les états vérifiables de ses enfants en utilisant choiceMode. Toutefois, CheckBox ne semble pas prendre en charge une case à cocher alignée à droite et CheckedTextView est une case à cocher à 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, 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, ce qui signifie qu'il peut recevoir des événements de mise au point et de clic, et qu'il semble correct pour ce qui est d'une case à cocher. La seule chose qui manque 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: cliquables, focalisable et onClickListener:

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

et le 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." 
    /> 
+0

Merci pour l'explication: ce n'était pas évident, pourquoi ce type de contrôles pourrait être non-cliquable par défaut. – Smileek

+4

Bonne réponse. Pour que le CheckedTextView se comporte encore plus comme un élément de liste, vous devez définir l'arrière-plan sur ? Android: attr/listChoiceBackgroundIndicator. – Moritz

+0

_ + 1_ pour cela aussi http://stackoverflow.com/questions/12641529/unable-to-check-uncheck-checkedtextview-inside-getview – nAkhmedov

0

Si vous voulez un contrôle plus fin sur l'étiquette et la case à cocher, une autre alternative est d'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 et la case à cocher pour répondre à vos besoins.

9

Vous pouvez utiliser et activer CheckedTextView par 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 ne pas oublier de mettre dessinables. Je l'obtiens du SDK ... \ windows android-sdk-\ platforms \ android-10 \ data \ res \ drawable-mdpi \

+0

Merci, cela a très bien fonctionné pour moi. – Jeff

1

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 le travail supplémentaire consiste à définir un OnClickListener sur la vue racine et à appeler le checkBox.toggle() sur le CheckBox.

1

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 l'adaptateur g etView

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); 
+0

où est la variable mCheckedItem son non dans mon ArrayAdapter. – JPM

+0

Vous pouvez mettre votre CheckedTextView où vous voulez. – Geek4IT

1

réponse est simple d'utilisation: isChecked() méthode 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 la méthode utilisant le statut view.isChecked().

Questions connexes