Подтвердить что ты не робот

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

Ответ 1

Вероятно, вы хотите просто использовать обычный CheckBox (который наследуется от Button и, следовательно, TextView). CheckedTextView предназначен для работы со списками. Пример CheckBox layout 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" />

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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