android: CheckedTextView cannot be checked?
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." />
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" />
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\