2011-01-21 10 views
77

Quiero imagenbotón con dos estados i) normal ii) toque (o haga clic).¿Cómo establecer la imagen de fondo del botón de imagen para un estado diferente?

he puesto imagen normal en el ImageButton fondo y estoy tratando cambioimagen (pulsado) a partir onclick método, pero no cambia.

Quiero que si presiono el botón de imagen, la imagen debería cambiar de normal a presionada hasta que presione el otro botón, pero no sucede.

¿Alguien me puede sugerir cómo puedo hacer esto con el selector o en el tiempo de ejecución?

Aquí está mi código imagebuttonpanel.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" 
    android:gravity="bottom" 
    android:id="@+id/buttonpanel"> 
    <ImageButton android:id="@+id/buttonhome" 
       android:layout_width="80dp" 
       android:layout_height="36dp" 
       android:focusable="true" 
       android:background="@drawable/homeselector"> 
       </ImageButton> 
    <ImageButton android:id="@+id/buttonsearch" 
       android:layout_height="36dp" 
       android:layout_width="80dp" 
       android:background="@drawable/searchselector" 
       android:focusable="true"> 
       </ImageButton>> 
    <ImageButton android:id="@+id/buttonreg" 
       android:layout_height="36dp" 
       android:layout_width="80dp" 
       android:background="@drawable/registerselector" 
       android:focusable="true"> 
       </ImageButton>> 
    <ImageButton android:id="@+id/buttonlogin" 
       android:layout_height="36dp" 
       android:layout_width="80dp" 
       android:background="@drawable/loginselector" 
       android:focusable="true"> 
       </ImageButton> 
</LinearLayout> 

y mi xml selector es

<?xml version="1.0" encoding="UTF-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!--<item android:state_pressed="true" android:drawable="@drawable/homehover" 
     /> <item android:state_focused="true" android:drawable="@drawable/homehover" 
     /> <item android:drawable="@drawable/home" /> <item android:state_window_focused="true" 
     android:drawable="@drawable/homehover" /> --> 
    <item android:state_enabled="false" android:drawable="@drawable/homehover" /> 
    <item android:state_pressed="true" android:state_enabled="true" 
     android:drawable="@drawable/homehover" /> 
    <item android:state_focused="true" android:state_enabled="true" 
     android:drawable="@drawable/homehover" /> 
    <item android:state_enabled="true" android:drawable="@drawable/home" /> 

</selector> 

y también he tratado de cambiar la imagen de recursos en caso ontouch y onclick, pero no resuelve el problema.

+0

Creo que eres mirada para algo como [esto] (http://stackoverflow.com/questions/3097710/android-change-button-background-programmatically/3097844#3097844). Hice una pregunta similar atrás. –

Respuesta

214

crear un archivo XML en su dibujable así:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:state_enabled="false" 
     android:drawable="@drawable/btn_sendemail_disable" /> 
    <item 
     android:state_pressed="true" 
     android:state_enabled="true" 
     android:drawable="@drawable/btn_send_email_click" /> 
    <item 
     android:state_focused="true" 
     android:state_enabled="true" 
     android:drawable="@drawable/btn_sendemail_roll" /> 
    <item 
     android:state_enabled="true" 
     android:drawable="@drawable/btn_sendemail" /> 
</selector> 

y configurar imágenes en consecuencia y luego configure este XML como fondo de su imageButton.

+11

Correcto. esto se llamará Selector XMLs –

+4

@Hitendra: supongo que el operador ya sabía esto. la pregunta puede interpretarse como por qué el selector no se invoca. – Samuel

+1

Funcionó súper para mí, muchas gracias – Naruto

8

Hola tratar el siguiente código que será de utilidad para usted,

((ImageView)findViewById(R.id.ImageViewButton)).setOnTouchListener(new View.OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
     if(event.getAction() == MotionEvent.ACTION_DOWN) 
      ((ImageView) v.findViewById(R.id.ImageViewButton)).setImageResource(R.drawable.image_over); 

     if(event.getAction() == MotionEvent.ACTION_UP) 
      ((ImageView) v.findViewById(R.id.ImageViewButton)).setImageResource(R.drawable.image_normal); 

     return false; 
    } 
}); 
+4

-1 La pregunta claramente indica el uso de selectores, no el código de Java – Merlin

+1

en realidad, esto tampoco funciona realmente, si action_up ocurre en una vista diferente. intente utilizar event.getAction() == MotionEvent.ACTION_CANCEL en lugar de ACTION_UP. – chug2k

14

probar este

btn.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
     btn.setBackgroundResource(R.drawable.icon); 
    } 
}); 
+0

intenté todo pero no de arriba me ayude. – Hitendra

+0

¿Hay alguien con una idea de que puedo hacerlo? – Hitendra

0

lo que está tratando de hacer es más bien un segmentedbutton que una lista ImageButton.

aquí http://blog.bookworm.at/2010/10/segmented-controls-in-android.html es un ejemplo de cómo hacerlo. La idea básica es personalizar RadioButton en lugar de ImageButton, ya que RadioButton tendrá el estado comprobado que necesita

+0

no .. No creo que eso sea lo que él quería. control segmentado es elemento de UI completamente diferente. él quiere 1 botón que cambia de estado. –

3

Creo que su problema no es el archivo selector.

hay que añadir

<imagebutton .. 
    android:clickable="true" 
/> 

a sus botones de imagen.

de forma predeterminada el onClick se maneja en el nivel de lista de elementos (principal). y los ImageButtons no reciben el onClick.

cuando agrega el atributo anterior, el botón de imagen recibirá el evento y se usará el selector.

verifique esto POST que explica lo mismo para la casilla de verificación.

1

si quieren botón de imagen prensado a continuación la imagen debe ser el cambio de normal a pulsar

Pero mejor manera será para personalizar el RadioButton y utilizarlos en un grupo. He visto un ejemplo de eso. Lo siento, no recuerdo ese enlace.

pero si quieres evitar eso. Debe agregar esto a su selector.xml

Once Done. Acaba de obtener su código y agregue este

public void onClick (View v) { 
    myImageButton.setSelected (true) ; 
} 

Verá el resultado. Pero debe controlar los estados que botón presionó recientemente. Para que pueda establecer

Le sugiero que ponga toda la referencia del botón en una matriz.

+0

disculpa por esto no fue útil en absoluto ... –

0

¿Has probado CompoundButton? CompoundButton tiene la propiedad comprobable que coincide exactamente con su necesidad. Reemplace ImageButtons con estos.

<CompoundButton android:id="@+id/buttonhome" 
        android:layout_width="80dp" 
        android:layout_height="36dp" 
        android:background="@drawable/homeselector"/> 

Cambie el selector xml a lo siguiente. Puede necesitar algunas modificaciones, pero asegúrese de usar state_checked en lugar de state_pressed.

<?xml version="1.0" encoding="UTF-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_enabled="false" android:drawable="@drawable/homehover" /> 
    <item android:state_checked="true" android:state_enabled="true" 
      android:drawable="@drawable/homehover" /> 
    <item android:state_focused="true" android:state_enabled="true" 
      android:drawable="@drawable/homehover" /> 
    <item android:state_enabled="true" android:drawable="@drawable/home" /> 

</selector> 

En CompoundButton.OnCheckedChangeListener es necesario comprobar y desmarque otra en función de sus condiciones.

mButton1.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

    public void onCheckedChanged (CompoundButton buttonView, boolean isChecked) { 
     if (isChecked) { 
      // Uncheck others. 
     } 
    } 
}); 

Del mismo modo establecer un OnCheckedChangeListener a cada botón, que se desmarca otros botones cuando se comprueba. Espero que esto ayude.

+0

No se puede usar CompoundButton directamente en XML, ya que es una clase abstracta. –

8

mhh. Tengo otra solución que me ayudó, porque sólo tengo dos sacia diferentes:

  • o bien el artículo no se hace clic en
  • o se hace clic con lo que se pondrá de relieve

En mi .xml defino la ImageButton así:

<ImageButton 
    android:id="@+id/imageButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/selector" /> 

el archivo de selección correspondiente es el siguiente:

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

    <item android:drawable="@drawable/ico_100_checked" android:state_selected="true"/> 
    <item android:drawable="@drawable/ico_100_unchecked"/> 

</selector> 

Y en mi onCreate que llamo:

final ImageButton ib = (ImageButton) value.findViewById(R.id.imageButton); 

    OnClickListener ocl =new OnClickListener() { 
     @Override 
     public void onClick(View button) { 
      if (button.isSelected()){ 
       button.setSelected(false); 
      } else { 
       ib.setSelected(false); 
       //put all the other buttons you might want to disable here... 
       button.setSelected(true); 
      } 
     } 
    }; 

ib.setOnClickListener(ocl); 
//add ocl to all the other buttons 

hecho. espero que esto ayude. Me tomó un tiempo averiguarlo.

0

se puede crear el archivo de selección en res/dibujable

ejemplo: res/estirable/selector_button.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/btn_disabled" android:state_enabled="false" /> 
    <item android:drawable="@drawable/btn_enabled" /> 
</selector> 

y en la actividad de diseño , fragmento o etc.

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/selector_bg_rectangle_black"/> 
Cuestiones relacionadas