Hacer RelativeLayout comprobable

Intento escribir mi propio CheckBox usando RelativeLayout con TextView y FrameLayout (con el selector en fondo) adentro.

Tengo setDuplicateParentStateEnabled(true) para FrameLayout que toma el estado checkable del padre, pero porqué hace RelativeLayout checkable No lo sé.

 public class MyCheckbox extends RelativeLayout implements OnClickListener, Checkable { private static final int ID_CHECKBOX = -1234411; private static final int ID_TEXTVIEW = -1234412; private static final int ID_PARENT = -1234413; private TextView textView; private FrameLayout checkBox; private boolean isChecked; public MyCheckbox(Context context) { this(context, null); } public MyCheckbox(Context context, AttributeSet attrs) { super(context, attrs); LayoutParams lp; setId(ID_PARENT); setOnClickListener(this); // checkBox checkBox = new FrameLayout(context); checkBox.setId(ID_CHECKBOX); checkBox.setDuplicateParentStateEnabled(true); // textView textView = new TextView(context); textView.setId(ID_TEXTVIEW); textView.setOnClickListener(this); boolean checkboxToRight = false; TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MaptrixCheckbox); for (int i = 0; i < a.getIndexCount(); i++) { int attr = a.getIndex(i); switch (attr) { case R.styleable.MyCheckbox_checkboxToRight: checkboxToRight = a.getBoolean(attr, false); break; case R.styleable.MyCheckbox_checkMark: checkBox.setBackgroundDrawable(a.getDrawable(attr)); break; case R.styleable.MyCheckbox_text: textView.setText(a.getText(attr)); break; } } a.recycle(); if (checkboxToRight) { lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); lp.addRule(ALIGN_PARENT_RIGHT); lp.addRule(CENTER_VERTICAL); lp.setMargins(margins, 0, margins, 0); addView(checkBox, lp); lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); lp.addRule(CENTER_VERTICAL); lp.addRule(LEFT_OF, ID_CHECKBOX); addView(textView, lp); } else { lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); lp.addRule(CENTER_VERTICAL); lp.setMargins(margins, 0, margins, 0); addView(checkBox, lp); lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); lp.addRule(CENTER_VERTICAL); lp.addRule(RIGHT_OF, ID_CHECKBOX); addView(textView, lp); } refreshDrawableState(); } @Override public void onClick(View v) { int id = v.getId(); if (id == ID_PARENT || id == ID_TEXTVIEW) toggle(); } public boolean isChecked() { return isChecked; } public void setChecked(boolean chacked) { isChecked = chacked; refreshDrawableState(); } @Override public void toggle() { isChecked = !isChecked; refreshDrawableState(); } } 

Parece que hay dos patrones de interfaz de usuario para listas de selección múltiple en Holo (en el contexto de ActionMode): mediante casillas de verificación o resaltado.

Si todo lo que necesita es resaltar, puede utilizar este método más simple:

Haga que su uso de la disposición del elemento de lista para la raíz una clase como esta:

 public class CheckableRelativeLayout extends RelativeLayout implements Checkable { private static final int[] STATE_CHECKABLE = {R.attr.state_pressed}; boolean checked = false; public void setChecked(boolean checked) { this.checked = checked; refreshDrawableState(); } public boolean isChecked() { return checked; } public void toggle() { setChecked(!checked); } @Override protected int[] onCreateDrawableState(int extraSpace) { int[] drawableState = super.onCreateDrawableState(extraSpace + 1); if (checked) mergeDrawableStates(drawableState, STATE_CHECKABLE); return drawableState; } } 

Y asegúrese de que el elemento raíz en el diseño del elemento de lista utilice

 android:background="?android:attr/listChoiceBackgroundIndicator" 

Sé que esto no es realmente una respuesta a su pregunta (quería una casilla de verificación real), pero no he visto esto documentado en cualquier lugar.

ListView utiliza la interfaz Comprobable para determinar si puede confiar en el elemento de elemento de lista para mostrar el estado comprobable o si debería intentar mostrarlo por sí mismo.

Sólo necesito método de anulación:

 private static final int[] STATE_CHECKABLE = {android.R.attr.state_checked}; @Override protected int[] onCreateDrawableState(int extraSpace) { int[] drawableState = super.onCreateDrawableState(extraSpace + 1); if (isChecked) mergeDrawableStates(drawableState, STATE_CHECKABLE); return drawableState; } 

Ahora todo funciona.

La respuesta de Nik es parcialmente correcta para mí, es necesario añadir android.R.attr.state_checkable a la matriz STATE_CHECKABLE, y establecer el correspondiente lenth (2), o bien no funciona.

 private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked, android.R.attr.state_checkable}; @Override protected int[] onCreateDrawableState(int extraSpace) { int[] result = super.onCreateDrawableState(extraSpace + CHECKED_STATE_SET.length); if(mChecked) mergeDrawableStates(result, CHECKED_STATE_SET); return result; } 

http://developer.android.com/reference/android/view/View.html#setClickable%28boolean%29

 public MyCheckbox(Context context) { this(context, null); this.setClickable(true); } public MyCheckbox(Context context, AttributeSet attrs) { super(context, attrs); this.setClickable(true); //...... } 
  • La columna GridLayout va más allá de sus límites
  • ¿Cómo puedo crear dinámicamente una lista de todos los componentes de Android ui mediante programación? Por ejemplo, TextView, ImageView, etc
  • Android, barra de progreso en ActionBar, y eliminar el progreso de círculo
  • En una actividad tabulada con ViewPager, el ListView aparece cortado desde la parte inferior
  • Cómo eliminar el espaciado del widget de pestañas en Android?
  • <include> atributo de sustitución de etiqueta
  • Cómo utilizar setOutlineProvider en lugar de setOutline en Lollipop
  • SlidingUpPanelLayout no se derrumbará al reanudar después de que el sistema operativo destruya mi actividad
  • Diseño del encabezado encima de TabLayout
  • Rotación de la vista Jerarquía 90 grados
  • Glide hace que ImageView wrap_content sea inútil y sin animatiion usando target
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.