2011-03-25 20 views
14

¿Alguien sabe si es posible hacer que ImageView se pueda verificar? Intento utilizar un recurso dibujable de lista estatal en mi proyecto, donde defino imágenes para mis estados de verificación de ImageView, pero no hay ninguna propiedad para hacer que ImageView sea seleccionable, solo se puede hacer clic.Visible ImageView

¿Quizás alguien sepa una forma de resolver este problema?

Respuesta

11

En lugar de hacer una comprobación de ImageView, puede establecer una lista de estado dibujable como fondo para una casilla de verificación que invertirá automáticamente las imágenes.

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_checkable="true" android:drawable="@drawable/icon_pressed" /> <!-- pressed --> 
    <item android:state_checked="true" android:drawable="@drawable/icon_focused" /> <!-- focused --> 
    <item android:drawable="@drawable/icon_default" /> <!-- default --> 
</selector> 
+2

Sí, esto es una buena opción, pero este enfoque no me permite eliminar el icono de casilla estándar. Obtengo el icono de casilla de verificación con mi icono en el fondo. – teoREtik

+4

Está bien, encontré cómo evitar esta falla: teoREtik

+1

Esto funciona bien, excepto que CheckBox no tiene un atributo "adjustViewBounds". Por lo tanto, cuando cambie desde un ImageView a un CheckBox, mi imagen se distorsiona en tamaño. ¿Alguna idea? – Amplify91

22

Utilice esta aplicación ImageView personalizado (tomado de here):

public class CheckableImageView extends ImageView implements Checkable { 
    private boolean mChecked; 

    private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked }; 

    public CheckableImageView(final Context context, final AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public int[] onCreateDrawableState(final int extraSpace) { 
     final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); 
     if (isChecked()) 
      mergeDrawableStates(drawableState, CHECKED_STATE_SET); 
     return drawableState; 
    } 

    @Override 
    public void toggle() { 
     setChecked(!mChecked); 
    } 

    @Override 
    public boolean isChecked() { 
     return mChecked; 
    } 

    @Override 
    public void setChecked(final boolean checked) { 
     if (mChecked == checked) 
      return; 
     mChecked = checked; 
     refreshDrawableState(); 
    } 
} 
+0

URL ya no es válida :( –

+0

@kilaka no creo que tenga un código importante. Solo quería para dar créditos a quien lo haya hecho, tal vez este sea un código similar (lo siento, no recuerdo lo que tenía): https://github.com/chrisbanes/photup/blob/master/client/src/uk/co/ senab/photup/views/CheckableImageView .java –

+0

El estado de CheckableImageView no cambia al hacer clic en la vista de la imagen. –

-1

esto lo he usado en mi aplicación

public class MainActivity extends Activity implements OnClickListener { 

private boolean paused = false; 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 

     switch (v.getId()) { 

      case R.id.imageview_pause: 

       paused = !paused; 

       if (paused) { 

        btn_pause.setBackgroundResource(R.drawable.pause_key_pressed); 

       }else{ 

        btn_pause.setBackgroundResource(R.drawable.pause_key); 
       } 

       break; 
     } 
} 
} 
1

que implementa OnClickListener a partir del código de Android Developer para la comprobación directa.

public class CheckableImageView extends ImageView implements Checkable, View.OnClickListener { 
    private boolean mChecked; 

    private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked }; 

    public CheckableImageView(final Context context, final AttributeSet attrs) { 
     super(context, attrs); 

     setOnClickListener(this); 
    } 

    @Override 
    public int[] onCreateDrawableState(final int extraSpace) { 
     final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); 
     if (isChecked()) 
      mergeDrawableStates(drawableState, CHECKED_STATE_SET); 
     return drawableState; 
    } 

    @Override 
    public void toggle() { 
     setChecked(!mChecked); 
    } 

    @Override 
    public boolean isChecked() { 
     return mChecked; 
    } 

    @Override 
    public void setChecked(final boolean checked) { 
     if (mChecked == checked) 
      return; 
     mChecked = checked; 
     refreshDrawableState(); 
    } 

    @Override 
    public void onClick(View v) { 
     toggle(); 
    } 
} 
0

Si desea cambiar el estado de comprobación mientras hace clic en ImageView, cambie "extender ImageView" a CompoundButton.

public class CheckableImageView extends CompoundButton { 

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

    public CheckableImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    private static final int[] CheckedStateSet = {android.R.attr.state_checked}; 

    public void setChecked(boolean b) { 
     boolean oldState = isChecked(); 
     super.setChecked(b); 
     if (b != oldState) { 
      refreshDrawableState(); 
     } 
    } 

    @Override 
    public int[] onCreateDrawableState(int extraSpace) { 
     final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); 
     if (isChecked()) { 
      mergeDrawableStates(drawableState, CheckedStateSet); 
     } 
     return drawableState; 
    } 

    @Override 
    protected void drawableStateChanged() { 
     super.drawableStateChanged(); 
     invalidate(); 
    } 

}