2010-10-19 28 views
139

¿Hay alguna manera fácil de usar una imagen personalizada para una casilla de verificación? Estoy buscando duplicar el comportamiento "destacado" de gmail. Así que quiero tener una casilla de verificación que, cuando esté marcada, sea una estrella rellena. Y cuando no está marcada es una estrella vacía. ¿Tengo que usar una vista de imagen y hacer mi propia lógica?Imagen de casilla personalizada android

Respuesta

112

Casillas de ser hijos de botón, se puede simplemente dar a su casilla de verificación de una imagen de fondo con varios estados como se describe here, en "estilo Button":

... y ejemplificado here:

+25

Gracias, que en realidad encontramos exactamente lo que necesitaba aquí http: //it-ride.blogspot. com/2010/04/how-to-android-favorite-button-right.html pero hubiera tenido que hacerlo a tu manera si quisiera una imagen personalizada __real__ = P – Falmarri

+2

Gracias.Exactamente lo que he estado buscando. He descubierto todo el estado, pero he estado configurando android: background en lugar de android: button y terminé con 2 botones. Ahora todo funciona bien. –

+1

-1. La solución 'android: button' a continuación es mucho mejor que usar el atributo de fondo. –

42

Copiar el btn_check. xml de android-sdk/platforms/android - #/data/res/drawable a la carpeta dibujable de su proyecto y cambie los estados de imagen "on" y "off" a sus imágenes personalizadas.

A continuación, el código XML sólo tendrá android:button="@drawable/btn_check"

<CheckBox 
    android:button="@drawable/btn_check" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:checked="true" /> 

Si desea utilizar iconos android diferente por defecto, puede utilizar android:button="@android:drawable/..."

+1

Mal consejo. Los íconos se pueden cambiar de una versión a otra y pueden desaparecer. Si realmente te gusta el icono predeterminado, puedes tomarlo de las fuentes. –

+0

¿Está diciendo que hacer referencia a los iconos predeterminados directamente a través de "@android: dibujable/..." es una mala idea, o este proceso por completo? – WOUNDEDStevenJones

+1

Ejemplo: la referencia a los íconos holo bloqueará su aplicación en dispositivos pre-nido de abeja. Es realmente difícil mantener y solucionar esos problemas. Por lo tanto, normalmente copio no solo xml, sino también las imágenes para que sean calculadas en un 100%, segurándome de que se encontrarán los recursos. También esto es muy importante para garantizar que la interfaz de usuario se vea igual en todos los dispositivos. –

5

Si tiene código de fuente abierta Android, se puede encontrar la definición estilos en:
src/marcos/base/núcleo/res/res/valores

<style name="Widget.CompoundButton.CheckBox"> 
    <item name="android:background"> 
     @android:drawable/btn_check_label_background 
    </item> 
    <item name="android:button"> 
     ?android:attr/listChoiceIndicatorMultiple 
    </item> 
</style> 
221

Crear un selector de casilla dibujable:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:drawable="@drawable/checkbox" 
      android:state_checked="false"/> 
    <item android:drawable="@drawable/checkboxselected" 
      android:state_checked="true"/> 
    <item android:drawable="@drawable/checkbox"/>  
</selector> 

Asegúrese de que la casilla de verificación es así android:button="@drawable/checkbox_selector"

<CheckBox 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:button="@drawable/checkbox_selector" 
    android:text="CheckBox" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:textColor="@color/Black" /> 
+0

¿En qué registro especifica este selector? ¿Dentro del archivo XML en el que también especifica el CheckBox? –

+0

Tom: cree su selector en la carpeta dibujable y la casilla de verificación en la carpeta de diseño –

+0

Tuve que cambiar'botón 'por' fondo 'en la casilla de verificación –

3

Inténtelo -

package com; 

import android.content.Context; 
import android.content.res.TypedArray; 
import android.util.AttributeSet; 
import android.view.View; 
import android.widget.ImageView; 



public class CheckBoxImageView extends ImageView implements View.OnClickListener { 
    boolean checked; 
    int defImageRes; 
    int checkedImageRes; 
    OnCheckedChangeListener onCheckedChangeListener; 

    public CheckBoxImageView(Context context, AttributeSet attr, int defStyle) { 
     super(context, attr, defStyle); 
     init(attr, defStyle); 
    } 

    public CheckBoxImageView(Context context, AttributeSet attr) { 
     super(context, attr); 
     init(attr, -1); 
    } 

    public CheckBoxImageView(Context context) { 
     super(context); 
    } 

    public boolean isChecked() { 
     return checked; 
    } 

    public void setChecked(boolean checked) { 
     this.checked = checked; 
     setImageResource(checked ? checkedImageRes : defImageRes); 
    } 

    private void init(AttributeSet attributeSet, int defStyle) { 
     TypedArray a = null; 
     if (defStyle != -1) 
      a = getContext().obtainStyledAttributes(attributeSet, R.styleable.CheckBoxImageView, defStyle, 0); 
     else 
      a = getContext().obtainStyledAttributes(attributeSet, R.styleable.CheckBoxImageView); 
     defImageRes = a.getResourceId(0, 0); 
     checkedImageRes = a.getResourceId(1, 0); 
     checked = a.getBoolean(2, false); 
     a.recycle(); 
     setImageResource(checked ? checkedImageRes : defImageRes); 
     setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     checked = !checked; 
     setImageResource(checked ? checkedImageRes : defImageRes); 
     onCheckedChangeListener.onCheckedChanged(this, checked); 
    } 

    public void setOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) { 
     this.onCheckedChangeListener = onCheckedChangeListener; 
    } 

    public static interface OnCheckedChangeListener { 
     void onCheckedChanged(View buttonView, boolean isChecked); 
    } 
} 

Añadir esta attrib -

<declare-styleable name="CheckBoxImageView"> 
     <attr name="default_img" format="integer"/> 
     <attr name="checked_img" format="integer"/> 
     <attr name="checked" format="boolean"/> 
</declare-styleable> 

uso como -

<com.adonta.ziva.consumer.wrapper.CheckBoxImageView 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/checkBox" 
     android:layout_width="40dp" 
     android:layout_height="40dp" 
     android:layout_alignParentRight="true" 
     android:layout_centerVertical="true" 
     android:clickable="true" 
     android:padding="5dp" 
     app:checked_img="@drawable/check_box_checked" 
     app:default_img="@drawable/check_box" /> 

Se fijará todas sus porblems.

+0

Faltan los métodos 'onSaveInstanceState()' y 'onRestoreInstanceState()', creo que el estado verificado perderse en la rotación – EpicPandaForce

2

Otra opción es utilizar un ToggleButton con fondo nulo y un botón personalizado.

Fuelle un ejemplo que también incluye un selector para el color del texto.

<ToggleButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:button="@drawable/toggle_selector" 
    android:background="@null" 
    android:paddingLeft="10dp" 
    android:layout_centerHorizontal="true" 
    android:gravity="center" 
    android:textColor="@drawable/toggle_text" 
    android:textOn="My on state" 
    android:textOff="My off state" /> 

toggle_selector.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item 
     android:state_checked="true" 
     android:drawable="@drawable/state_on" /> 

    <item 
     android:drawable="@drawable/state_off" /> 

</selector> 

toggle_text.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item 
     android:state_checked="true" 
     android:color="@color/app_color" /> 

    <item 
     android:color="@android:color/darker_gray" /> 

</selector> 
Cuestiones relacionadas