Android: CheckedTextView не может быть проверен?

Первоначально я хотел поставить галочку, где текст размещен слева от галочки. После поиска на этом сайте я обнаружил, что лучший обходной путь - это 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 ответов

Решение

Вы, вероятно, хотите просто использовать обычный 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" />

Возможно и несколько просто реализовать то, что вы ищете. Да, 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."
    />

Вы можете использовать и переключать 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\

Простой ответ это использовать: 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() метод.

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

Вот мое использование в 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);

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

Другие вопросы по тегам