我是新人,我知道我会因为这个问题而受到打击,但如果我得到答案,那将是值得的。我有一个游戏,当用户赢得第一轮时,我希望保存得分并重新启动活动,而不是遍历所有代码并重置每个值。现在,如何在活动重新启动时保持分数不会重置。我还没有例子。
public class MainActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
// SET UP SPINS
private TextView spins;
private Button spin;
// SET UP CONTROLS
private TextView score;
private ProgressBar progressBar;
private static final int SHOW_BONUSACTIVITY = 1;
int nextspin = 0;
int alert;
int total = 0;
int totalspins = 14;
public int gamescore = 0;
public int currentgamescore = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.play_layout);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
这是我第一次检查是否有新游戏或者是否保存了高分的地方
if (GameState.INSTANCE.getScore() != 0){
gamescore = GameState.INSTANCE.getScore();}
如果用户赢了,那么他们就会获得奖金游戏,如果他们已经完成游戏并且需要开始新游戏那么就会看到
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case (SHOW_BONUSACTIVITY): {
if (resultCode == Activity.RESULT_OK) {
int bonus = data.getIntExtra("money", 0);
gamescore=(gamescore + bonus);
score.setText(String.valueOf("SCORE: " + gamescore));
if (bigwin == true){
在这里,我保存了游乐场,如果它们处于第一级,我将把它带入新的活动。
GameState.INSTANCE.addScore(gamescore);
Intent intent = new Intent(
MainActivity.this,
com.bigdaddyapp.android.blingo.MainActivity.class);
startActivity(intent);
}
}
}
}
}
下一个代码是枚举活动
public enum GameState {
INSTANCE;
private int score;
private GameState(){
score = 0;
}
public int getScore(){
return score;
}
public void addScore(int score){
this.score += score;
}
}
答案 0 :(得分:3)
您可以使用SharedPreferences作为一种简单的持久存储机制来保存分数,生命等等。当关卡结束时,通过putInt()保存分数,当您想获得分数时使用getInt()。
答案 1 :(得分:2)
作为存储值持久性的替代方法(使用“共享首选项”或“SQLite数据库”),您还可以将值存储在内存中,但存储在更全局的上下文中。通过这种方式,您可以在重新创建活动时保持状态,但应用程序在关闭时会忘记它们。
这可能不是您特定情况所需要的,但有时候这是更好的选择。
使用Singleton ,您可以更全面地存储应用程序的状态,并在代码中的任何位置检索它。一个例子可能是:
public enum GameState{
INSTANCE;
private int score;
private GameState(){
score = 0;
}
public int getScore(){
return score;
}
public void addScore(int score){
this.score += score;
}
}
只需写一下即可使用:
GameState.INSTANCE.addScore(20);
GameState.INSTANCE.getScore();
有多种方法可以实现单例。在我的例子中,我使用了Joshua Bloch在他的书“Effective Java - Second Edition”中记录的方法。 See wikipedia了解更多信息。
扩展android.app.Application
是另一种选择,不像使用单身人士那样推荐。来自the JavaDoc:
需要维护全局应用程序状态的基类。 您可以通过在您的名称中指定其名称来提供自己的实现 AndroidManifest.xml的标记,这将导致该类 在你的过程中为你实例化 应用程序/包已创建。
可能会找到有关如何执行此操作的教程here(以及linked answer)。
答案 2 :(得分:0)
当你想结束游戏时,请执行以下操作:
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putInt("gamevariable", gamevariable);
editor.commit();
然后在你的onCreate方法中,取回你的变量并按你的意愿使用它:
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
myvariable = settings.getInt("gamevariable", false);
作为替代方案,我会使用标准序列化,这是一个更复杂但更容易的选择。
首先将您的整数写入.ser文件,稍后您可以将其读取并保存到项目目录中:
OutputStream os = new FileOutputStream("myinteger.ser");
ObjectOutput oo = new ObjectOutputStream(os);
oo.writeObject(myinteger);
oo.close();
然后在下次加载活动时将整数读回变量:
InputStream is = new FileInputStream("myinteger.ser");
ObjectInput oi = new ObjectInputStream(is);
int myinteger = (int) oi.readObject();
oi.close();