4

Ich habe zwei Bilder, ein rotes Licht und ein grünes Licht. Ich habe eine benutzerdefinierte ListView, die ich möchte ein rotes Licht anzeigen, wenn ein Listenelement inaktiv ist, und ein grünes Licht, wenn es aktiv ist. Ein Listenelement wird aktiviert, wenn es gedrückt wird.Android ImageView NullPointerException

Hier ist mein 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); 

ich eine Nullpointer bekommen die Linie ausführt, der die Bildressource setzt. Also habe ich ein wenig getestet, ich löschte die Zeile, die den Quellcode in der XML-Datei festlegte und versuchte es nur in der Hauptklasse zu setzen. Immer noch ein NPE. Also habe ich versucht, die Ressource nicht zu ändern, sondern nur das Alpha zu ändern. Immer noch NPE.

Ich bin mir nicht sicher, was ich falsch mache. Die Dateien light_off.png und light_on.png sind beide in res/drawable-ldpi und beide von ihnen funktionieren, wenn ich sie in der XML angeben. Aber jede Änderung, die ich versuche, in der Hauptdatei zu iconLight zu machen, verursacht diese NPE. Irgendwelche Ideen?

+0

Könnten Sie bitte die ganze Datei einfügen, wo Sie die NPE bekommen? – Cristian

+0

die Datei ist ziemlich viele hundert Zeilen. – linsek

Antwort

12

Der einzige Weg, um eine NPE in der Leitung zu bekommen ...

iconLight.setImageResource(R.drawable.light_on); 

Ist für iconLight null zu sein. Ihre findViewById schlägt also fehl. Haben Sie Ihr Layout vor dem Aufruf von findViewById festgelegt? Sind Sie sicher R.id.iconLight ist im Root-Layout der Aktivität?

+0

Duh, das ist das Problem. Mann, dachte nicht einmal nach. Nein, die aktuelle Inhaltsansicht ist 'R.layout.main' und die ImageView befindet sich in row.xml. Ich frage mich, warum Eclipse in 'R.id.iconLight' dann automatisch ausgefüllt wurde ... naja. Wie würde ich auf den ImageView zugreifen, während ich die aktuelle Ansicht auf main belassen würde? – linsek

+1

Das sollte wahrscheinlich eine separate Frage sein (ich denke, es könnte sogar nicht trivial sein), aber ich werde sagen, dass Sie die imageView (s) irgendwie anhängen müssen und da dies für eine Liste ist, wird es wahrscheinlich durch eine erfolgen Adapter. Wie du Zugang zu einem einzigen hast, entgeht mir im Moment. Wahrscheinlich müssen einige Callbacks eingerichtet werden, wenn Sie die Ansicht im Adapter erstellen. Außerdem ist eclipse dumm und vervollständigt * alle * ids automatisch, da es nicht weiß, mit welcher Ansicht Ihr Code arbeitet. –

+0

Danke für die Einsicht Andrew. Ich habe ein Adapter-Setup, um meine benutzerdefinierten Listenkomponenten zu erstellen. Wenn ich die Ressource des Imageview dort eingestellt habe, hat es ohne Fehler funktioniert. Es war dumm, davon auszugehen, dass die automatische Vervollständigung in Eclipse bedeutete, dass die Datei sie tatsächlich sehen konnte. Ich denke, ich werde mich hier hinsetzen und eine Logik wiederholen müssen, damit das funktioniert. Schätze die Hilfe. – linsek

0

Ich hatte das gleiche Problem. Hier ist ein Code, der mir geholfen hat zu verstehen. Es ist für ein Dialogfenster, aber könnte Ihnen auch helfen.

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); 

Beobachten Sie die Zeile vor dem letzten. Beachten Sie, wie das ImageView instanziiert wird. Jedenfalls wird jede Änderung an dem Bild nach der setContentView vorgenommen.