2012-09-03 3 views
24

Je viens d'ajouter un nouveau dossier dessablable sous le dossier res. Dans le dossier drawable, j'ai copié le fichier ic_launcher.png du dossier drawable-hdpi. Je veux changer l'image ImageButton standard par le nouveau quand j'appuie sur le bouton. J'ai écrit du code, mais quand je démarre l'application, elle plante.android Imagebutton change Image OnClick

Button imgButton; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    findViewById(R.id.imgButton).setOnClickListener(imgButtonHandler);  
} 

View.OnClickListener imgButtonHandler = new View.OnClickListener() { 

    public void onClick(View v) { 

     imgButton.setBackgroundResource(R.drawable.ic_launcher); 

    } 
}; 

EDIT: J'ai changé pour ceci, et cela ne fonctionne pas non plus.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    imgButton = (Button) findViewById(R.id.imgButton); 
    imgButton.setOnClickListener(imgButtonHandler); 
} 


View.OnClickListener imgButtonHandler = new View.OnClickListener() { 

    public void onClick(View v) { 
     imgButton.setBackgroundResource(R.drawable.ic_launcher); 

    } 
}; 

EDIT 2: CE FONCTIONNEMENT. Merci à tous.

ImageButton button; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    button= (ImageButton)findViewById(R.id.imgButton); 
    button.setOnClickListener(imgButtonHandler); 
} 


View.OnClickListener imgButtonHandler = new View.OnClickListener() { 

    public void onClick(View v) { 
     button.setBackgroundResource(R.drawable.ic_launcher); 

    } 
}; 
+0

Vous devez coller ici votre erreur de logcat. – hsz

+0

NullpointerException coz imgButton est null ... vous pouvez afficher View v to Button ou définir imgButton après setContentView ... – Selvin

+0

Votre modification est ma réponse, et cela fonctionne! – Carnal

Répondre

6

C'est parce que imgButton est null. Essayez ceci:

findViewById(R.id.imgButton).setBackgroundResource(R.drawable.ic_action_search); 

ou beaucoup plus facile à lire:

imgButton = (Button) findViewById(R.id.imgButton); 
imgButton.setOnClickListener(imgButtonHandler); 

puis à onClick: imgButton.setBackgroundResource(R.drawable.ic_action_search);

+0

Non .. c'est ok, j'ai édité maintenant. Cela ne fonctionne pas avec ic_launcher.png – user1205415

+0

findViewById (R.id.imgButton) .setBackgroundResource (R.drawable.ic_launcher); Ha ... cela a fonctionné. Quand je le lance, il a la nouvelle image. Ensuite, je ne comprends pas, pourquoi le code ci-dessus ne fonctionne pas dans le onClick? – user1205415

+0

Cela ne fonctionne pas parce que vous avez Button imgButton; déclaré .. mais vous ne l'initie pas une vue, c'est pourquoi. Lors de l'utilisation de findViewById (...) vous obtenez la vue du bouton (bouton dans ce cas), donc cela fonctionne. – Carnal

1

Vous avez le bouton assing à votre variable imgButton:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    imgButton = (Button) findViewById(R.id.imgButton); 
    imgButton.setOnClickListener(imgButtonHandler); 
} 
3

Vous pouvez le faire correctement dans votre fichier XML:

android:onClick="@drawable/ic_action_search" 
+0

OK, mais ce qui est, quand je clique à nouveau sur le bouton, je veux l'ancienne image. Comme un bouton à bascule. – user1205415

+2

mais cela ne change pas l'image plutôt que de bloquer l'activité avec un journal ** 'java.lang.IllegalStateException: Impossible de trouver une méthode res/drawable-hdpi/menu_mission_touch.png (Voir) dans la classe d'activité com.test.MainMenu pour le gestionnaire onClick sur la classe de vue android.widget.ImageButton avec l'ID 'menu_mission' '** –

+0

ce n'est pas possible! – Jorgesys

49

cela me misleaded un peu - il devrait être "setImageResource" au lieu de "setBackgroundResource" :) !!

Les travaux suivants fin:

ImageButton btn = (ImageButton)findViewById(R.id.imageButton1);  
btn.setImageResource(R.drawable.actions_record); 

tout en utilisant les setBackgroundResource l'image de ImageButton réelle séjour alors que l'image de fond est changé sorcière conduit à un objet laid ImageButton recherche

Merci.

+0

Correct; faire le 'setBackgroundResource' semble étirer l'image pour qu'elle corresponde au bouton afin qu'elle soit déformée. – KickingLettuce

+0

génial de travail ..... –

9
<ImageButton android:src="@drawable/image_btn_src" ... /> 

image_btn_src.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_pressed="true" android:drawable="@drawable/icon_pressed"/> 
<item android:state_pressed="false" android:drawable="@drawable/icon_unpressed"/> 
</selector>