4

J'ai deux images, une lumière rouge et une lumière verte. J'ai un ListView personnalisé que je voudrais montrer une lumière rouge quand un article de liste est inactif, et une lumière verte quand elle est active. Un élément de liste est activé lorsqu'il est enfoncé.Android ImageView NullPointerException

Voici mon code

row.xml

<ImageView 
    android:id="@+id/iconLight" 
    android:src="@drawable/light_off" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 

main.java

ImageView iconLight = (ImageView)findViewById(R.id.iconLight); 
iconLight.setImageResource(R.drawable.light_on); 

Je reçois un NullPointerException exécutant la ligne qui définit la ressource d'image. J'ai donc fait un peu de test, j'ai supprimé la ligne en plaçant le src dans le fichier XML et j'ai juste essayé de le mettre dans la classe principale. Encore un NPE. J'ai donc essayé de ne pas changer la ressource, mais juste de changer l'alpha. Toujours NPE.

Je ne suis pas sûr de ce que je fais mal. Les fichiers light_off.png et light_on.png sont tous les deux dans res/drawable-ldpi et l'un d'entre eux fonctionne lorsque je les spécifie dans le fichier XML. Mais toute modification que je tente de faire à iconLight dans le fichier principal provoque ce NPE. Des idées?

+0

Pourriez-vous s'il vous plaît coller le fichier complet où vous obtenez le NPE? – Cristian

+0

le fichier est quelques centaines de lignes. – linsek

Répondre

12

La seule façon d'obtenir un NPE dans la ligne ...

iconLight.setImageResource(R.drawable.light_on); 

Est-ce pour iconLight être nulle. Ainsi, votre findViewById échoue. Avez-vous défini votre mise en page avant d'appeler findViewById? Êtes-vous sûr R.id.iconLight est dans la disposition racine de l'activité?

+0

duh, c'est le problème. l'homme, ne pensait même pas. Non, la vue du contenu actuel est 'R.layout.main' et ImageView est dans row.xml. Je me demande pourquoi Eclipse a rempli automatiquement 'R.id.iconLight' alors ... oh bien. Comment accéder à ImageView tout en laissant l'affichage en cours à Main? – linsek

+1

Cela devrait probablement être une question distincte (je pense que cela pourrait même être non trivial) mais je dirai que vous devez attacher l'image (s) en quelque sorte et puisque c'est pour une liste, il va probablement être fait par un Adaptateur. Comment vous accédez à un seul m'échappe pour le moment. Vous devez probablement configurer des rappels lorsque vous créez la vue dans l'adaptateur. En outre, eclipse est bête et auto complète * tous les * ids car il ne sait pas avec quelle vue fonctionne votre code. –

+0

Merci pour la perspicacité Andrew. J'ai une configuration d'adaptateur pour créer mes composants de liste personnalisés. Lorsque j'ai défini la ressource imageview là-dedans, cela a fonctionné sans erreur. Il était stupide de supposer que l'auto-complétion dans Eclipse signifiait que le fichier pouvait réellement le voir. Je pense que je vais devoir m'asseoir et refaire une logique ici pour faire ce travail. Appréciez l'aide. – linsek

0

J'ai eu le même problème. Voici un code qui m'a aidé à comprendre. C'est pour une fenêtre de dialogue mais pourrait vous aider aussi.

final Dialog dialog = new Dialog(context); 
    dialog.setContentView(R.layout.custom); 
    dialog.setTitle("Title..."); 
    TextView text = (TextView) dialog.findViewById(R.id.text); 
    text.setText("Android"); 
    ImageView image = (ImageView) dialog.findViewById(R.id.image); 
    image.setImageResource(R.drawable.ic_launcher); 

Regardez la ligne avant la dernière ligne. Notez comment instancie l'ImageView. De toute façon, toute modification de l'image est effectuée après setContentView.

Questions connexes