Zugriff einer static Klasse auf Intent

A

AlexL1980

Neues Mitglied
0
Hallo!

Ich versuche mich gerade an einem Spiel und bin am verzweifeln:

Ich habe eine Klasse spiel erstellt, welche alle Einstellungen des Spiels enthält.
Code:
[B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]public[/COLOR][/SIZE][/COLOR][/SIZE][/B]
[LEFT][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]class[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] spiel [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]extends[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] Activity {[/SIZE]
[B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]...[/COLOR][/SIZE][/COLOR][/SIZE][/B]
[B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]int [/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]gesundheit[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2];[/SIZE]
[SIZE=2]int geld;[/SIZE][/LEFT]
 
[LEFT][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]public [/COLOR][/SIZE][/COLOR][/SIZE][/B][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]void[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] lebenminus() {[/SIZE][/LEFT]
[SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0][COLOR=#000000]ge[/COLOR]sundheit[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]--;[/SIZE]

[LEFT][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]if[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] ([/SIZE][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]gesundheit[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]==0) {[/SIZE][/LEFT]

 
[LEFT][SIZE=2]Intent intent = [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] Intent(spiel.[/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]this[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2], Verloren.[/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]class[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2]); [/SIZE]

[SIZE=2]startActivity(intent);[/SIZE][/LEFT]
 
[LEFT][SIZE=2]}[/SIZE]
[SIZE=2]}[/SIZE][/LEFT]
 
[LEFT][SIZE=2][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]public[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] spiel() {[/SIZE][/SIZE][/LEFT]

[SIZE=2][LEFT][SIZE=2]geld=300;[/SIZE][/SIZE]
[SIZE=2][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]gesundheit[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]=1;[/SIZE]
}
}[/LEFT]
[/SIZE]

Um darauf zugreifen zu können habe ich in der Activity wo man auf einen Button "Neues Spiel" klickt folgendes gemacht´:

Code:
[LEFT][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]public [/COLOR][/SIZE][/COLOR][/SIZE][/B][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]class[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] Start [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]extends[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] Activity {[/SIZE]
 

[B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]public [/COLOR][/SIZE][/COLOR][/SIZE][/B][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]static[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] spiel [/SIZE][I][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]s[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2];[/SIZE][/LEFT]

 
[LEFT][SIZE=2][COLOR=#646464][SIZE=2][COLOR=#646464]@Override[/COLOR][/SIZE][/COLOR][/SIZE]
[B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]public [/COLOR][/SIZE][/COLOR][/SIZE][/B][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]void[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] onCreate(Bundle savedInstanceState) {[/SIZE]

[B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]super[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2].onCreate(savedInstanceState);[/SIZE]
[LEFT][SIZE=2]setContentView(R.layout.[/SIZE][I][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]start[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2]);[/SIZE][/LEFT]

[SIZE=2]Button spielstarten1 = (Button) findViewById(R.id.[/SIZE][I][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]spielstarten[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2]);[/SIZE]

[SIZE=2]spielstarten1.setOnClickListener([/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] OnClickListener() { [/SIZE]
[LEFT][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]public [/COLOR][/SIZE][/COLOR][/SIZE][/B][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]void[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] onClick(View v) { [/SIZE]
[I][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]s[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2]=[/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] spiel();[/SIZE]
[SIZE=2]Intent intent = [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] Intent(Start.[/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]this[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2], Hauptscreen.[/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]class[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2]); [/SIZE][/LEFT]


[SIZE=2][/SIZE]
[/LEFT]
[SIZE=2]startActivity(intent);[/SIZE]
[LEFT]
[LEFT][SIZE=2]finish();[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2]});[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2]}[/SIZE][/LEFT]
[/LEFT]

Somit kann ich von jeder Activity aus über Start.s.gesundheit den Gesundheitswert abfragen.​

Mein Problem ist nun: Wenn der Spieler stirbt (Gesundheit=0) soll ein Verloren-Bildschirm angezeigt werden. Ich nutze hierzu die Funktion lebenminus der Spiel-Klasse. Das Programm soll einen Gesundheitspunkt abziehen und wenn Gesundheit=0=tot die Verloren-Activity anzeigen. Dies funktioniert nicht und ich komme nicht dahinter warum das so ist.​

Sobald das Intent erstellt wird stürzt das Spiel ab.​

Gruß,​

Alex​
 
Zuletzt bearbeitet:
Hallo Alex,

Logcat wäre wie immer hilfreich ;)

Und zweitens.. hä? ^^

Deine Klasse Spiel ist eine Activity. Activitys werden NICHT mit Kontruktoren instanziert!


  1. Entweder du machst aus Spiel eine normale Klasse und für startIntent(..) bastelst du dir was, was mit den aktuellen Context deiner aktiven Activity arbeitet.
  2. Oder du behälst die Vererbung, muss dir dann aber was basteln, was ohne den Konstruktor arbeitet.
Sollte als Denkansatz reichen ;) Frag ruhig, wenn du nicht weiter kommst.. aber erst ma Logcat.

regards
 
  • Danke
Reaktionen: AlexL1980
der Konstruktor sollte vor onCreate() aufgerufen werden ;)
 
@Fr4gg0r: Das Spiel sollte aber immer neu initialisiert werden, wenn auf Neues Spiel geklickt wird. Wenn ich das vor oncreate() mach, dann werden die Werte nicht zurückgesetzt.

@Neeldarax:

Ich kann mir gut vorstellen, wie verwunderlich mein Code für einen Nicht-Laien ist :D

1. Was ist LogCat? Ich habe im Debugger ein Fenster was so heißt... da kommen immer diese Meldungen (onSignalStrenghtChange, usw.). Meinst Du das?

1. Entweder du machst aus Spiel eine normale Klasse und für startIntent(..) bastelst du dir was, was mit den aktuellen Context deiner aktiven Activity arbeitet.

Wenn ich die Spielklasse als normale Klasse ohne extends Activity deklariere habe ich doch keinen Zugriff auf neue Intents, oder? Das drumrumbasteln habe ich schon versucht... bin aber mangels Kenntnissen gescheitert. Es ist für mich einfach nur verwirrend, was der Unterschied zwischen getContext, getApplicationContext und Klassenname.this ist. Was ich gelernt habe: egal was ich davon nehme - die App stürzt ab :sad:.

2. Oder du behälst die Vererbung, muss dir dann aber was basteln, was ohne den Konstruktor arbeitet.

Nunja... wenn Du schreibst, dass dies kein guter Weg ist eine Activity abzuleiten dann wäre die 2te Option eigentlich keine Option... ich möchte es schon richtig machen. Aber wenn ich nicht weiterkomme versuche ich gerne Dinge aus.

Danke!

Gruß,

Alex
 
Hmm, ich hab da grad ein Verständnisproblem mit static und finish. Du rufst in deiner Activity Spiel ja nach dem Erzeugen des Intents finish() auf. Damit wird doch die Klasse eigentlich zerstört. Kann man dann noch auf Start.s zugreifen? Bin da grad etwas verwirrt ;-)

Prinzipiell würde ich mir für meine statischen Werte eine eigene Klasse machen (GlobalStats oder so), und diese natürlich nicht von Activity oder sonst was ableiten.

Ansonsten mal den Aufbau und die Ablauflogik überdenken, vielleicht stimmts da ja nicht richtig :)
 
In Android gibt es eine Klasse PreferenceActivity, mittels derer Du Schlüssel/Wert Paare speichern kannst und auf die von überall in der App zugreifen kannst. Diese Klasse stellt Dir sogar ein GUI für das Ändern dieser Key/Value Paare durch den Benutzer zur Verfügung.

Im übrigen wird der Lebenszyklus einer Activity vom ActivityManager gesteuert. Du als Entwickler kannst nur durch die Events wie onCreate(), onPause(), onResume(), etc. auf den Ablauf der App Einfluss nehmen, im Gegensatz zu Java. Schau Dir einfach mal den Activity Lebenszyklus an und die 4 grundsätzlichen Komponenten Activity, Service, Intent, Broadcast Receiver an (beachte: Ein Service hat einen anderen Lebenszyklus als eine Activity)

Android wird zwar in Java programmiert, das Programmierparadigma ist aber grundsätzlich verschieden.
 
  • Danke
Reaktionen: AlexL1980
So... ich habe nun die Spielklasse mit implements serializable abgeleitet (ohne extends Activity).

Bei Klick auf neues Spiel instanziere ich die Klasse ohne Static. Mit Putextra werden die Klasseneinstellungen an die nächste Activity durchgereicht... und siehe da - alles funktioniert.

Vielen Dank an alle die geholfen haben!

Gruß,

Alex

Gesendet mit der Android-Hilfe.de-App
 

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
5
Aufrufe
106
swa00
swa00
D
  • Data2006
Antworten
14
Aufrufe
483
jogimuc
J
Zurück
Oben Unten