android:CheckedTextView不能被检查?

最初我想要复选标记左侧的文字。 在这个网站search后,我发现最好的解决方法是android:CheckedTextView? 但是,我发现这个复选标记不能被用户手动改变。 是由devise?

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

您可能只想使用常规CheckBox (从Buttoninheritance而来,因此TextView )。 CheckedTextView被devise用来处理列表视图。 示例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主要用于ListView行中的单个Checkable视图,该视图使用choiceMode控制其子项的可检查状态。 但是,由于CheckBox似乎并不支持右alignment的checkbox,而CheckedTextView 右alignment的checkbox,因此想要使用那里的内容是有意义的。

由于ListView控制列表项的选中状态,因此CheckedTextView本身不响应点击事件,并且默认情况下不可点击或可调焦。 它确实响应按下和集中的状态,但是 – 这意味着它可以接收焦点和点击事件,并且只要checkbox应该看起来正确。 唯一缺less的是它不会在点击时切换其选中状态。 因此,调用.toggle()一个快速的OnClickListener将会给你你正在寻找的最终结果。

总之,你需要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); } } 

不要忘记把drawables。 我从SDK中得到它… \ android-sdk-windows \ platforms \ android-10 \ data \ res \ drawable-mdpi \

此布局的外观和行为与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上调用checkBox.toggle()

简单的答案是使用: 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()方法获取状态。

如果你想对标签和checkbox进行更细粒度的控制,另一种方法是使用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> 

然后您可以调整textview和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);