1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Zugriff einer static Klasse auf Intent

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von AlexL1980, 27.10.2011.

  1. AlexL1980, 27.10.2011 #1
    AlexL1980

    AlexL1980 Threadstarter Neuer Benutzer

    Beiträge:
    12
    Erhaltene Danke:
    0
    Registriert seit:
    24.10.2011
    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: 27.10.2011
  2. Neeldarax, 27.10.2011 #2
    Neeldarax

    Neeldarax Erfahrener Benutzer

    Beiträge:
    170
    Erhaltene Danke:
    31
    Registriert seit:
    07.12.2010
    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
     
    AlexL1980 bedankt sich.
  3. Fr4gg0r, 27.10.2011 #3
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    der Konstruktor sollte vor onCreate() aufgerufen werden ;)
     
  4. AlexL1980, 27.10.2011 #4
    AlexL1980

    AlexL1980 Threadstarter Neuer Benutzer

    Beiträge:
    12
    Erhaltene Danke:
    0
    Registriert seit:
    24.10.2011
    @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?

    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:.

    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
     
  5. Tom299, 28.10.2011 #5
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    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 :)
     
  6. mradlmaier, 28.10.2011 #6
    mradlmaier

    mradlmaier Gewerbliches Mitglied

    Beiträge:
    158
    Erhaltene Danke:
    17
    Registriert seit:
    28.10.2011
    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.
     
    AlexL1980 bedankt sich.
  7. AlexL1980, 29.10.2011 #7
    AlexL1980

    AlexL1980 Threadstarter Neuer Benutzer

    Beiträge:
    12
    Erhaltene Danke:
    0
    Registriert seit:
    24.10.2011
    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
     

Diese Seite empfehlen