Android: CheckedTextView не может быть проверен? - PullRequest
46 голосов
/ 13 апреля 2010

Изначально я хотел поставить галочку, где текст размещен слева от галочки. После поиска на этом сайте я обнаружил, что лучший обходной путь - это Android: CheckedTextView? Однако я обнаружил, что галочка не может быть изменена пользователями вручную. Это по дизайну?

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

Ответы [ 7 ]

121 голосов
/ 11 мая 2010

Возможно и несколько просто реализовать то, что вы ищете. Да, CheckedTextView используется главным образом для того, чтобы иметь один Checkable вид в строке ListView, который управляет проверяемыми состояниями своих детей, используя choiceMode. Однако, поскольку CheckBox, по-видимому, сам по себе не поддерживает флажок с выравниванием по праву, а CheckedTextView является флажком с выравниванием по праву, имеет смысл использовать то, что есть.

Поскольку ListView контролирует проверенное состояние элемента списка, сам CheckedTextView не реагирует на события щелчка, и по умолчанию он не активируется или не активируется. Однако он реагирует на нажатые и сфокусированные состояния - это означает, что он может получать события фокуса и щелчка, и выглядит правильно, насколько должен выглядеть флажок. Единственное, чего не хватает, так это того, что он не переключает свое проверенное состояние при нажатии. Поэтому быстрый OnClickListener, который вызывает .toggle(), даст вам конечный результат, который вы ищете.

В итоге вам нужно 3 вещи: кликабельный, фокусируемый и onClickListener:

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

и файл макета:

<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."
    />
37 голосов
/ 15 апреля 2010

Вы, вероятно, хотите просто использовать обычный CheckBox (который наследуется от Button и, следовательно, TextView). CheckedTextView предназначен для работы с представлениями списка. Пример CheckBox макета XML приведен ниже:

<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" />
9 голосов
/ 01 февраля 2012

Вы можете использовать и переключать CheckedTextView следующим образом:

В макете:

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

В вашей деятельности:

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);
        }
}

И не забудьте поставить раскладушки. Я получаю его из SDK ... \ android-sdk-windows \ platform \ android-10 \ data \ res \ drawable-mdpi \

2 голосов
/ 08 мая 2015

используется простой ответ: isChecked() метод вместо 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);            
        }
    }
});

и получить статус, используя метод view.isChecked().

1 голос
/ 26 октября 2013

Вот мое использование в 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.В адаптере getView

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 голос
/ 04 июля 2013

Этот макет выглядит и ведет себя так же, как 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>

Единственным дополнительным трудом является установка OnClickListener в корневом представлении и вызов checkBox.toggle() для CheckBox.

0 голосов
/ 26 сентября 2011

Если вы хотите более детального контроля над меткой и флажком, другой альтернативой является использование RelativeLayout и атрибута 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>

затем вы можете отрегулировать поля / etc текстового представления и флажок в соответствии с вашими потребностями.

...