Hi,
Ich programmiere Java für Android,
mein Problem fällt in den Bereich Java.
In der Startdatei initialisiere und weise ich zu. Hier der wesentliche Auszug (Beobachte den Button btnSuply!)
public Button btnSupply;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
btnSupply = (Button) findViewById(R.id.btn_supply);
btnSupply.setOnLongClickListener(longClickListener);
}
```
Der longClickListener sieht so aus:
OnLongClickListener longClickListener = new OnLongClickListener(){
@Override
public boolean onLongClick(View v) {
switch (v.getId()) {
case R.id.btn_supply:
btnSupply.setPressed(true);
break;
}
return false;
}
};```
Soweit alles gut. Wenn der Button nun lange geklickt wird und der longClickListener aufgerufen wird, dann ist btnSupply wieder “null”, so als hätte nie eine Zuweisung statt gefunden.
Ich sehe dass wenn ich beim debuggen mit der Maus auf btnSupply (2.Quellcode Zeile 7) halte und keine Zuweisung sehe. Hingegen behält btn_supply (2.Quellcode Zeile 6, Variablenname aus der xml) seine Zuweisung (id,…).
Woran liegt das?
Warum kann ich nicht auf den Button btnSupply zugreifen?
(z.B. Textinhalt od. Erscheinungsbild ändern)
Frank
Hast du nur eine Instanz dieser Klasse? Wird onCreate() in jedem Fall vor onLongClick() aufgerufen?
Ja, onCreate wird zuerst aufgerufen.
Und was meinst du mit “Hast du nur eine Instanz dieser Klasse?” ?
Die Klasse wird nur einmal initialisiert, onCreate nur einmal aufgerufen, btnSupply nur einmal zugewiesen… .
Nunja, dass sich ein Member einfach so mal “nullt”, passiert eben nicht… Ich würde einfach mal die einzelnen Methodenaufrufe loggen (auch den Konstruktor) und dann ggf. noch einen Breakpoint auf Lese-/Schreibzugriff von btnSupply
setzen.
Anhand des Codes ist nicht ersichtlich warum auf einmal die Instanzvariable die Referenz verlieren sollte. Da muss noch etwas anderes passieren.
Danke soweit schon mal.
Ich habe das Programm zeilenweise debugged.
Bis die onCreate() verlassen wird, behält btnSupply seine Zuweisung.
Von dort springt der Code / das Programm nach Instrumentation.class (wie gesagt, zeilenweises Debuggen).
Von da an ist die Referenz verschwunden.
Was die Klasse Instrumentation so macht weiß / verstehe ich leider (noch) nicht, da ich noch nicht so tief in der Materie stecke.
Diese Klasse stammt offensichtlich aus der Java-Bibliothek und wird „automatisch“ aufgerufen. Von mir ist sie nicht.
Weiß da noch jemand weiter?
ist dies vielleicht ein Android-spezifisches Problem?
Frank
*** Edit ***
Nachtrag:
Wenn ich mir den Inhalt von Instrumentation.class anschaue, so lese ich dort:
Source not found
The JAR file C:.…\Development\adt-bundle-windows-x86_64-20130729\sdk\platztforms\android-18\android.jar has no source attachment.
You can attach the source by clicking Attach Source below:
dann folgt ein Button „Attach Source…“.
Diesen klicke ich,
ich soll zu meinem Workspace browsen,
das tue ich und „ok“.
Weiter passiert nix. Beim nächsten Start des Programmes passiert das Selbe.
Die angegebene Datei ist übrigens vorhanden, auch auf angegebenen Pfad.
Gehören beide Codeausschnitte zur selben Activity?
Das Problem kann ich nicht nachvollziehen. Wenn die Instanzvariable in der onCreate initialisiert wurde, gibt es keinen Grund warum diese dann später im Listener plötzlich keine Referenz mehr hält. Das ist ja das übliche Vorgehen - vielleicht nicht mit Buttons aber mit anderen Views x-mal so praktiziert.
Wie schaut denn die Fehlermeldung dazu in LogCat aus?
*** Edit ***
[QUOTE=frankmehlhop]Source not found
The JAR file C:…\Development\adt-bundle-windows-x86_64-20130729\sdk\platztforms\android-18\android.jar has no source attachment.[/QUOTE]
Besagt ja nur, dass der Quellcode zur Klasse nicht vorhanden ist, ist für Dein Problem aber irrelevant.
Ja, die beiden Codeausschnitte stehen beide in der selben Activity.
Keine Meldung im Logcat!
Der Programm durchläuft die switch case -Anweisung ohne zu mucken,
führt allerdings btnSupply.setPressed(true) nicht aus und wie geschrieben wird bei btnSupply keine Referenz angezeigt (beim mouseover).
Was erwartest Du das das passieren soll? Benutze doch einfach mal setText(„irgendeinneuertext“); um zu testen.
Im Titel schreibst Du was von einer NullPointerException, wie kommst Du darauf wenn diese im LogCat gar nicht auftaucht? Ist das eine Vermutung nur aufgrund der Tatsache, dass sich bei setPressed - für Dich augenscheinlich - nichts tut?