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é.
- Hacer dos LinearLayouts tiene el 50% de la pantalla cada uno sin usar layout_weight
- Barra de herramientas android muestra medio contenido
- ¿Cómo hacer que el trasfondo de una actividad sea translúcido?
- ¿Por qué añadir <merge> cambia el diseño de Android?
- Reducir márgenes en los diseños de Android
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(); } }
- Android - Cómo almacenar una información oculta extra (s) (por etiqueta) en el diseño
- Permitir rotación / paisaje en un fragmento
- TextView sin ningún relleno predeterminado
- Añadir botones a la disposición relativa Dinámica o extensión lineal Layout android
- Cambiar el color predeterminado de la marca de verificación de CheckBox de Android
- Obtener las coordenadas de View en relación con el diseño raíz
- Error al configurar el estilo de texto personalizado en mi aplicación
- Modificación de la imagen de recurso de la barra de progreso
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); //...... }
- Obtener 'Su entrada no es válida' al obtener una clave de API para Google Maps API v2
- ActionBarCompat con Theme.AppCompat.Light.DarkActionBar muestra el texto del título blanco pero el texto del hilador negro