web-dev-qa-db-fra.com

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 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"/> 
46
Yang

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" />
37
Roman Nurik

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."
    />
121
Joe

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 \

9
Nikolay Nikiforchuk

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().

2
vikoo

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);
1
Geek4IT

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.

1
Jason Robinson

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.

0
Kent McNeill