Android: CheckedTextView no se puede comprobar?
-
26-09-2019 - |
Pregunta
Al principio yo quería una marca de verificación donde se coloca el texto a la izquierda de la marca de verificación. Después de buscar en este sitio descubrí la mejor solución es androide: CheckedTextView? Sin embargo, descubrí que la marca de verificación no se puede cambiar 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"/>
Solución
Es posible que desee utilizar simplemente un habitual CheckBox
(que hereda de Button
y por lo tanto TextView
). CheckedTextView
está diseñado para trabajar con vistas de lista. Ejemplo de composición CheckBox
XML es el siguiente:
<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" />
Otros consejos
Es posible, y algo fácil de poner en práctica lo que busca. Sí, CheckedTextView
se utiliza principalmente para tener una visión única Checkable
en la fila de un ListView
, que controla los estados checkable de sus niños usando choiceMode
. Sin embargo, desde CheckBox no parece apoyar una casilla de verificación alineado a la derecha en su propia, y CheckedTextView es una casilla de verificación alineado a la derecha, tiene sentido querer utilizar lo que hay.
Debido a ListView controla el estado de activación de un elemento de la lista, el propio CheckedTextView no responde a los eventos de clic, y no se puede hacer clic o enfocable por defecto. Lo hace responder a los Estados prensadas y se centró, sin embargo - que significa que puede recibir el foco y haga clic en eventos, y parece ser correcta en cuanto a una casilla de verificación debe mirar. Lo único que falta es que no lo hace alternar su estado activado al hacer clic. Por lo tanto, un OnClickListener rápida que las llamadas .toggle()
le dará el resultado final que usted está buscando.
En resumen, necesita 3 cosas: se puede hacer clic, enfocable, 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 usar y alternar CheckedTextView de la siguiente manera:
En el diseño:
<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 se olvide de poner dibujables. Lo entiendo de SDK ... \ android-sdk-windows \ plataformas \ android-10 \ data \ res \ dibujable-mdpi \
respuesta simple es el uso:. isChecked()
método en 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 utilizando el método view.isChecked()
.
En este diseño se ve y se comporta de la misma manera como 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 trabajo de campo adicional es establecer un OnClickListener
en la vista raíz y checkBox.toggle()
llamada en el CheckBox
.
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>
getView adaptador de 4.In
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);
Si desea más control preciso sobre la etiqueta y la casilla de verificación, otra alternativa es utilizar 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>
A continuación, se puede ajustar el margen / etc de la TextView y casilla de verificación para que se adapte a sus necesidades.