android: CheckedTextView cannot be checked?

后端 未结 7 1105
遇见更好的自我
遇见更好的自我 2020-12-08 06:41

Initially I wanted a checkmark where the text is placed on the left of the checkmark. After searching on this site I found out the best workaround is android:CheckedTextView

相关标签:
7条回答
  • 2020-12-08 06:54

    It is possible, and somewhat simple to implement what you are looking for. Yes, CheckedTextView is used primarily for having a single Checkable view in the row of a ListView, which controls its children's checkable states using choiceMode. However, since CheckBox does not appear to support a right-aligned checkbox on its own, and CheckedTextView is a right-aligned checkbox, it makes sense to want to use what's there.

    Because ListView controls the checked state of a list item, the CheckedTextView itself does not respond to click events, and is not clickable or focusable by default. It does respond to pressed and focused states, however -- that means it can receive focus and click events, and looks correct as far as a checkbox should look. The only thing missing is that it does not toggle its checked state on click. Therefore, a quick OnClickListener that calls .toggle() will give you the end result you're looking for.

    In summary, you need 3 things: clickable, focusable, and onClickListener:

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

    and layout file:

    <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 讨论(0)
  • 2020-12-08 06:54

    You can use and toggle CheckedTextView by the following way:

    In layout:

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

    In your activity:

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

    And don't forget to put drawables. I get it from SDK ...\android-sdk-windows\platforms\android-10\data\res\drawable-mdpi\

    0 讨论(0)
  • 2020-12-08 06:59

    This layout looks and behaves the same way as 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>
    

    Only extra legwork is to set an OnClickListener on the root view and call checkBox.toggle() on the CheckBox.

    0 讨论(0)
  • 2020-12-08 07:00

    If you want more fine-grained control over the label and the checkbox, another alternative is to use RelativeLayout and the android:layout_alignParentRight attribute:

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

    you can then adjust the margin/etc of the textview and checkbox to suit your needs.

    0 讨论(0)
  • 2020-12-08 07:09

    You probably want to just use a regular CheckBox (which inherits from Button and thus TextView). CheckedTextView is designed to work with list views. Example CheckBox layout XML is below:

    <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" />
    
    0 讨论(0)
  • 2020-12-08 07:10

    Here is my use in 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.radio.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.In Adapter's 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);
    
    0 讨论(0)
提交回复
热议问题