Android: CheckedTextView no se puede comprobar?

Inicialmente quería una marca de verificación donde el texto se coloca a la izquierda de la marca de verificación. Después de buscar en este sitio descubrí que la mejor solución es android: CheckedTextView? Sin embargo, descubrí que la marca de verificación no puede ser cambiada manualmente por los usuarios. ¿Es por diseño?

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

Es probable que desee sólo utilizar un regular CheckBox (que hereda de Button y, por tanto, TextView ). CheckedTextView está diseñado para trabajar con vistas de lista. Ejemplo El formato XML de CheckBox está debajo:

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

Es posible, y algo sencillo de implementar lo que está buscando. Sí, CheckedTextView se utiliza principalmente para tener una sola vista Checkable en la fila de un ListView , que controla los estados choiceMode sus hijos con choiceMode . Sin embargo, dado que CheckBox no parece soportar una casilla de verificación alineada a la derecha por sí solo, y CheckedTextView es una casilla de verificación alineada a la derecha, tiene sentido usar el contenido.

Porque ListView controla el estado marcado de un elemento de lista, el propio CheckedTextView no responde a eventos de clic y no se puede hacer clic o se puede enfocar de forma predeterminada. Sin embargo, responde a estados presionados y enfocados, lo que significa que puede recibir eventos de enfoque y clic y parece correcto en la medida en que una casilla de verificación debe aparecer. Lo único que falta es que no cambia su estado comprobado al hacer clic. Por lo tanto, un OnClickListener rápido que llama a .toggle() le dará el resultado final que está buscando.

En resumen, necesitas 3 cosas: clickable, focusable y onClickListener:

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

Y archivo de diseño:

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

Puede utilizar y activar CheckedTextView de la siguiente manera:

En disposición:

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

En su actividad:

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

Y no te olvides de poner drawables. Lo obtengo desde el SDK … \ android-sdk-windows \ plataformas \ android-10 \ data \ res \ drawable-mdpi \

Este diseño se ve y se comporta de la misma manera que 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> 

Sólo el trabajo extra es establecer un OnClickListener en la vista raíz y llamar a checkBox.toggle() en el CheckBox .

La respuesta simple es el uso: método isChecked() lugar de 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); } } }); 

Y obtener el estado mediante el método view.isChecked() .

Si desea un control más fino sobre la etiqueta y la casilla de verificación, otra alternativa es usar RelativeLayout y el atributo 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> 

Puede ajustar el margen / etc de la vista de texto y la casilla de verificación para adaptarse a sus necesidades.

Aquí está mi uso en 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.En el adaptador 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); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.