Score anzeigen lassen!!

  • 13 Antworten
  • Letztes Antwortdatum
N

newperson

Neues Mitglied
1
Hallo,
ich möchte gerne den Score auf der GameOver Activity anzeigen lassen, leider weiß ich nicht was ich falsch gemacht habe.

Also die Punkte die ich im Spiel geschafft habe gebe ich bei der gameOver() als
Code:
private void gameOver() {	
		setResult(punkte);
		Intent theNextIntent = new Intent(this, GameOverActivity.class);
		this.startActivityForResult(theNextIntent, 1);	
	}
zurück.

Diese Punkte die ich erreicht habe möchte ich auf der GameOver Classe anzeigen lassen, wenn ich auch einen neuen Rekord geschafft habe.

Code:
public class GameOverActivity extends Activity implements OnClickListener{
	
	private ImageButton bReplay, bExit;
	private LinearLayout namenseingabe;
	private Button speichern;
	
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.gameoverscreen);
		
		bReplay = (ImageButton) findViewById(R.id.bReplay);
		bExit = (ImageButton) findViewById(R.id.bExit);
		bReplay.setOnClickListener(this);
		bExit.setOnClickListener(this);
		namenseingabe = (LinearLayout) findViewById(R.id.namenseingabe);
		speichern = (Button) findViewById(R.id.speichern);
		speichern.setOnClickListener(this);
		namenseingabe.setVisibility(View.INVISIBLE);
	}

	@Override
	protected void onResume() {
		super.onResume();
		/*TextView tv = (TextView) findViewById(R.id.tvHighscore);
		tv.setText(Integer.toString(leseHighscore()));*/
		highscoreAnzeigen();
	}
	
	@Override
	public void onClick(View view) {
		switch (view.getId()) {
		case R.id.bReplay:
			Intent newGameScreen = new Intent(getApplicationContext(), GameSecond.class);
			startActivity(newGameScreen);
			this.finish();
			break;
		case R.id.bExit:
			Intent menuInetent = new Intent(getApplicationContext(), MainActivity.class);
			startActivity(menuInetent);
			this.finish();
			break;
		case R.id.speichern:
			schreibeHighscoreName();
			highscoreAnzeigen();
			namenseingabe.setVisibility(View.INVISIBLE);
			break;
		}
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if(requestCode==1) {
			if(resultCode > leseHighscore()) {
				schreibeHighscore(resultCode);
				namenseingabe.setVisibility(View.VISIBLE);
			}
		}
	}
	
	private void highscoreAnzeigen() {
		TextView tv = (TextView) findViewById(R.id.highscore);
		int highscore = leseHighscore();
		if(highscore>0) {
			tv.setText(Integer.toString(highscore) + " " + getResources().getString(R.string.von) + " " + leseHighscoreName());
		}else {
			tv.setText("-");
		}
	}
	
	private int leseHighscore() {
		SharedPreferences pref = getSharedPreferences("GAME", 0);
		return pref.getInt("HIGHSCORE", 0);
	}
	
	private String leseHighscoreName() {
		SharedPreferences pref = getSharedPreferences("GAME", 0);
		return pref.getString("HIGHSCORE_NSME", "");
	}
	
	private void schreibeHighscore(int highscore) {
		SharedPreferences pref = getSharedPreferences("GAME", 0);
		SharedPreferences.Editor editor = pref.edit();
		editor.putInt("HIGHSCORE", highscore);
		editor.commit();
	}
	
	private void schreibeHighscoreName() {
		TextView tv = (TextView) findViewById(R.id.spielername);
		String name = tv.getText().toString().trim(); //trim() vorn und hinten Leerzeichen entfernen
		SharedPreferences pref = getSharedPreferences("GAME", 0);
		SharedPreferences.Editor editor = pref.edit();
		editor.putString("HIGHSCORE_NAME", name);
		editor.commit();
	}
}

ich hoffe ihr könnt mich helfen!
 
Machs dir leichter :D
Setzt am anfang der Activity mit den punkten
Code:
static int punkte;

In der GameOver Klasse einfach am anfang
Code:
//Ist egal ob du private public oder sonst was nimmst
public int punkte = MainActivity.punkte;

Die kannste dann ganz leicht benutzen
 
Danke für die Antwort. :)
Ich habe dein Vorschlag ausprobiert, leider funktioniert es nicht.
Da ich noch ein Anfänger bin, habe ich sicher etwas falsch gemacht.
Mein Problem ist das er nicht meine Punkte erkennt und die dann als Score ausgeben soll.
Code:
private void highscoreAnzeigen() {
		TextView tv = (TextView) findViewById(R.id.tvHighscore);
		int highscore = leseHighscore();	
		if(highscore>0) {
			tv.setText(Integer.toString(highscore) + " " + getResources().getString(R.string.von) + " " + leseHighscoreName());
		}else {
			tv.setText("No Score");
		}
	}

Er gibt nur immer "No Score" aus, daher glaube ich es liegt an diesen Problem.
 
haiaiai Greenstar, jede Antwort von dir im Entwicklerforum lautet "mach einfach alles static" :biggrin: das ist aber in den meisten Fällen total unsauber. Es gibt fast immer eine bessere Lösung :winki:

@newperson: Ich nehme an du hast erst eine GameActivity (oder so änhlich) und von da aus wechselst du auf die HighscoreActivity? Dann ist startActivityForResult und onActivityResult der falsche Weg, das funktioniert genau anders rum (damit startet man eine Activity, von der man ein Resultat erwartet. Nicht eine Activity, an die man ein Resultat senden will).

Bei dir sollte das ungefähr so aussehen:

GameActivity
Code:
private void gameOver() {
    Intent theNextIntent = new Intent(this, GameOverActivity.class);

    //[COLOR="SeaGreen"][I]Highscore im Intent ablegen[/I][/COLOR]
    theNextIntent.putExtra("highscore", punkte);

    //[COLOR="SeaGreen"][I]Activity normal starten (nicht startActivityForResult)[/I][/COLOR]
    startActivity(theNextIntent);
}

HighscoreActivity
Code:
public class GameOverActivity extends Activity implements OnClickListener{

    protected void onCreate(Bundle savedInstanceState) {
        
        //[COLOR="SeaGreen"][I]dein bisheriger Code[/I][/COLOR]

        //[COLOR="SeaGreen"][I]Hole die Daten aus dem Intent[/I][/COLOR]
        Bundle extras = getIntent().getExtras();

        //[COLOR="SeaGreen"][I]Zur Sicherheit prüfen, ob wirklich etwas drin ist[/I][/COLOR]
        if(extras != null) {

            //[COLOR="SeaGreen"][I]Den Wert holen, der vorher in der GameActivity hinterlegt wurde[/I][/COLOR]
            int highscore = extras.getInt("highscore");

            if(highscore > leseHighscore()) {
                schreibeHighscore(highscore);
                namenseingabe.setVisibility(View.VISIBLE);
            }
        }
    }
}

(Natürlich wäre das ganze auch mit startActivityForResult möglich, aber wenn man das nicht unbedingt braucht, wird der Code etwas einfacher. HIER gibts ein Beispiel, wie man startActivityForResult richtig verwendet)
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: DagobertDokate und amfa
Zoopa: Danke für die Antwort. :)

Leider habe ich noch ein Problem:
Code:
Bundle extras = getIntent().getExtras();
Bei dieser Code-Zeile markiert er immer das Semikolon ROT ?!
 
Was sagt Eclipse (oder Android Studio) dazu? Wenn du kurz mit dem Mauszeiger auf die Fehlerstelle zeigst, sollte Eclipse (und Android Studio vermutlich auch?) etwas dazu sagen. Sonst zeig am besten mal die ganze onCreate-Methode. Ich hab das ganze nicht getestet, vielleicht habe ich irgendwas übersehen :winki:
 
Also das ist die Fehlermeldung: "Syntax error on token ";", { expected after this token"

Und das ist der ganze Code:
Code:
public class GameOverActivity extends Activity implements OnClickListener{
		
	//public static int punkte;
	private ImageButton bReplay, bExit;
	private LinearLayout namenseingabe;
	private Button speichern;
		
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.gameoverscreen);
			
		bReplay = (ImageButton) findViewById(R.id.bReplay);
		bExit = (ImageButton) findViewById(R.id.bExit);
		bReplay.setOnClickListener(this);
		bExit.setOnClickListener(this);
		namenseingabe = (LinearLayout) findViewById(R.id.namenseingabe);
		speichern = (Button) findViewById(R.id.speichern);
		speichern.setOnClickListener(this);
		namenseingabe.setVisibility(View.INVISIBLE);
	}
	
	@Override
	protected void onResume() {
		super.onResume();
	/*	TextView tv = (TextView) findViewById(R.id.tvHighscore);
		tv.setText(Integer.toString(leseHighscore())); */
		highscoreAnzeigen();
	}
	
	@Override
	public void onClick(View view) {
		switch (view.getId()) {
		case R.id.bReplay:
			Intent newGameScreen = new Intent(getApplicationContext(), GameSecond.class);
			startActivity(newGameScreen);
			this.finish();
			break;
		case R.id.bExit:
			Intent menuInetent = new Intent(getApplicationContext(), MainActivity.class);
			startActivity(menuInetent);
			this.finish();
			break;
		case R.id.speichern:
			schreibeHighscoreName();
			highscoreAnzeigen();
			namenseingabe.setVisibility(View.INVISIBLE);
			break; 
		} 
	}

/*	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if(requestCode==1) {
			if(resultCode > leseHighscore()) {
				schreibeHighscore(resultCode);
				namenseingabe.setVisibility(View.VISIBLE);
			}
		}
	} */
	
	private void highscoreAnzeigen() {
		TextView tv = (TextView) findViewById(R.id.tvHighscore);
		int highscore = leseHighscore();	
		if(highscore>0) {
			tv.setText(Integer.toString(highscore) + " " + getResources().getString(R.string.von) + " " + leseHighscoreName());
		}else {
			tv.setText("No Score");
		}
	} 
	
	private int leseHighscore() {
		SharedPreferences pref = getSharedPreferences("GAME", 0);
		return pref.getInt("HIGHSCORE", 0);
	}
	
	private String leseHighscoreName() {
		SharedPreferences pref = getSharedPreferences("GAME", 0);
		return pref.getString("HIGHSCORE_NAME", "");
	}
	
	private void schreibeHighscore(int highscore) {
		SharedPreferences pref = getSharedPreferences("GAME", 0);
		SharedPreferences.Editor editor = pref.edit();
		editor.putInt("HIGHSCORE", highscore);
		editor.commit();
	}
	
	private void schreibeHighscoreName() {
		TextView tv = (TextView) findViewById(R.id.spielername);
		String name = tv.getText().toString().trim(); //trim() vorn und hinten Leerzeichen entfernen
		SharedPreferences pref = getSharedPreferences("GAME", 0);
		SharedPreferences.Editor editor = pref.edit();
		editor.putString("HIGHSCORE_NAME", name);
		editor.commit();
	}
	
		Bundle extras = getIntent().getExtras();
	
		if(extras != null) {
			int highscore = extras.getInt("highscore");
		
			if(highscore > leseHighscore()) {
				schreibeHighscore(highscore);
				namenseingabe.setVisibility(View.VISIBLE);
			}
		}		
	}
}
 
Im allgemeinen sind Programmbefehle besser aufgehoben, wenn sie innerhalb einer Methode stehen. :D
 
Danke für die Hilfe, es funktioniert. :)
 
@Zoopa: Ich wusste nicht das es nicht so gut ist, danke für die info ^^
 
@Greenstar so allgemein ist das auch nicht richtig.
Statische Variablen kann man machen, wenn etwas wirklich statisch ist.

Vorallem bei sowas wie Konstanten
java.lang.Math hat z.B die statische (final) Variable PI.
Da macht es auch sinn da der Wert von PI sich eher selten ändert.

Der unterschied zwischen statischen und nicht statischen Variablen ist der, dass statische Variablen nur ein einziges mal vorhanden sind pro Klasse.

Nehmen wir an, wir haben eine Klasse MyClass diese hat eine Methode
addiereZahl(int zahl) {
summe = summe + zahl;
}
eine Methode
int getSumme() {
return summe;
}
und eine statische Variable summe

private static int summe;

Wenn du nun folgendes machst

MyClass a = new MyClass();
MyClass b = new MyClass()

a.addZahl(10);

print(a.getSumme());
print(b.getSumme());

Dann steht in beiden Ausgaben 10 obwohl du für b niemals was hinzugefügt hast, weil die statische Variable summe nur exakt einmal für für die Klasse MyClass vorhanden ist auch wenn du mehre Objekte davon erzeugst.

Noch interessanter ist aber, dass diese static variable solange lebt wie die VM lebt.
Wenn du also in meinem Beispiel a=null setzt und b= null setzt und dann irgendwann anders in deinem code
MyClass c = new MyClass();
machst.. und direkt danach
print(c.getSumme())

wird dort auch wieder 10 ausgegeben.
Es besteht also immer die Gefahr, dass der Wert nicht wie erwartet ist.

nimmst du das static weg ist die Ausgabe
10
0
weil du bei b niemals was addierst hast.


Statische Variablen sind nur dann sinnvoll wenn du wirklich etwas Objektübergreifend speichern musst.
z.B. wenn du gucken willst wie oft ein Objekt erzeugt wurde z.B.
 
  • Danke
Reaktionen: Zoopa
Richtig ;)
Ich dachte nur wenn ich mit Classloadern anfange verwirrt das zu sehr (und das dürfte in der Praxi für die meisten hier eh keine große Rolle spielen ;))
 
amfa bitte Code-Tags verwenden :thumbsup:

@Greenstar: Aus Design-Sicht versucht man oft, static zu vermeiden, weil es zu einer engen Kopplung von Code führt. Einfach gesagt bedeutet das, dass eine Klasse von einer anderen Klasse abhängig ist. Wenn du also in einer Klasse ein Attribut statisch machst, nur damit du in einer anderen Klasse einfacher darauf zugreifen kannst, koppelst du die beiden Klassen eng aneinander. Wenn du zum Beispiel mal den Namen des statischen Attributs ändern willst, musst du auch alle anderen Klassen anpassen, in denen du das Attribut verwendest. Oft will man soetwas wenn möglich vermeiden.

Aber natürlich hat amfa Recht: Es gibt einige Stellen, wo static immer und auch zurecht verwendet wird. Man sollte sich halt im klaren darüber sein, wie static genau funktioniert und was es mitsich bringt.
 
Zuletzt bearbeitet:
Zurück
Oben Unten