2011-01-21 15 views
77

Desidero pulsante immagine con due stati i) normale ii) tocco (o clic).Come impostare l'immagine di sfondo del pulsante immagine per stato diverso?

Ho impostato immagine normale nel ImageButton sfondo e sto cercando di cambiare immagine (premuto) da onclick metodo, ma non cambia.

Voglio che se premo il tasto immagine, l'immagine dovrebbe cambiare da normale a premuto fino a quando premo altro pulsante, ma non succede.

Qualcuno può suggerirmi come posso farlo con il selettore o in fase di esecuzione?

Ecco il mio codice 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> 

e il mio selettore XML è

<?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> 

E ho anche provato a cambiare risorsa immagine sull'evento ontouch e onclick, ma non aiuta.

+0

Penso che tu sembri per qualcosa come [questo] (http://stackoverflow.com/questions/3097710/android-change-button-background-programmatically/3097844#3097844). Ho fatto una domanda simile prima. –

risposta

214

creare un file XML in drawable come questo:

<?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> 

e impostare di conseguenza le immagini e quindi impostare questo XML come sfondo del vostro imageButton.

+11

corretto. questo sarà chiamato Selector XMLs –

+4

@Hitendra: immagino che l'op lo sapesse già. la domanda può essere interpretata come il motivo per cui il selettore non viene richiamato. – Samuel

+1

Ha funzionato molto bene per me, grazie mille – Naruto

8

Hi provare il seguente codice sarà utile a voi,

((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 Domanda indica chiaramente l'utilizzo di selettori, non il codice java – Merlin

+1

in realtà, anche questo non funziona davvero, se action_up si verifica su una vista diversa. prova a utilizzare event.getAction() == MotionEvent.ACTION_CANCEL invece di ACTION_UP. – chug2k

14

Prova questa

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

ho provato tutti, ma non di sopra, aiutami. – Hitendra

+0

c'è qualcuno con l'idea che io possa farlo – Hitendra

0

ciò che si sta cercando di fare è più un segmentedbutton di un elenco ImageButton.

qui http://blog.bookworm.at/2010/10/segmented-controls-in-android.html è un esempio su come farlo. L'idea di base è di personalizzare RadioButton invece di ImageButton, poiché il RadioButton avrà lo stato verificato che è necessario

+0

no .. Non credo che sia quello che voleva. il controllo segmentato è un elemento dell'interfaccia utente completamente diverso. vuole un pulsante che cambi stato. –

3

penso che il problema non sia il file di selezione.

si deve aggiungere

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

ai pulsanti di immagine.

per impostazione predefinita il onClick viene gestito a livello di listino (genitore). e i imageButtons non ricevono il onClick.

quando si aggiunge l'attributo di cui sopra, il pulsante dell'immagine riceverà l'evento e verrà utilizzato il selettore.

controllare questo POST che spiega lo stesso per la casella di controllo.

1

se volete pulsante immagine pressato quindi immagine deve essere il cambiamento da normale a pressione

Ma modo migliore sarà quello di personalizzare il RadioButton e utilizzarli in un gruppo. Ne ho visto un esempio. Scusa se non ricordo quel collegamento.

ma se si vuole evitare questo. È necessario aggiungerlo al selector.xml

Fatto. Appena arrivato al tuo codice e aggiungi questo

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

Vedrai il risultato. Ma devi gestire gli stati che pulsante è stato premuto di recente. In modo che è possibile impostare

myOLDImageButton.setSelected (false) ; 

Ti suggerisco di mettere tutti i pulsanti di riferimento in una matrice.

+0

scusa per questo non è stato affatto utile ... –

0

Hai provato CompoundButton? CompoundButton ha la proprietà controllabile che corrisponde esattamente alle tue necessità. Sostituisci i ImageButtons con questi.

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

Modificare il selettore xml come segue. Potrebbe essere necessario qualche modifica, ma assicurati di utilizzare state_checked al posto di 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> 

In CompoundButton.OnCheckedChangeListener è necessario controllare e deselezionare le altre in base alle proprie condizioni.

mButton1.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

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

Analogamente impostare un OnCheckedChangeListener a ogni pulsante, che deselezionare altri pulsanti quando viene selezionata. Spero che questo ti aiuti.

+0

Non è possibile utilizzare CompoundButton direttamente in XML poiché è una classe astratta. –

8

mhh. Ho ottenuto un'altra soluzione che mi ha aiutato, perche' devo solo due diversi sates:

  • o l'articolo non si fa clic
  • o si fa clic e così sarà evidenziato

Nella mia .xml definisco l'ImageButton in questo modo:

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

il file di selezione corrispondente appare così:

<?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> 

E nella mia onCreate io chiamo:

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 

fatto. spero che questo ti aiuti. mi ci è voluto un po 'per capire.

0

è possibile creare file di selettore nella res/drawable

esempio: res/drawable/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> 

e nell'attività di layout , frammento o ecc.

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/selector_bg_rectangle_black"/> 
Problemi correlati