![](/img/trans.png)
[英]How do I change my level after a certain score has been reached? (Java, NetBeans)
[英]How to remember score after app has been restarted?
我正在做一个两人游戏,我可以重新比赛。 我也在跟踪每个玩家的分数。 这是我的重赛代码如下所示:
public void rematch(View view) {
Intent i = getBaseContext().getPackageManager()
.getLaunchIntentForPackage( getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
finish();
startActivity(i);
}
当用户单击重新匹配按钮时,将调用上述代码。 我基本上只是重新启动应用程序,因为它比重置我拥有的所有变量都容易。 无论如何,为了跟踪得分,我像这样重写了onStop()
方法:
@Override
protected void onStop() {
super.onStop();
// We need an Editor object to make preference changes.
// All objects are from android.context.Context
SharedPreferences settings = getSharedPreferences(SCORES_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putInt("scoreOne", p1Score);
editor.putInt("scoreTwo", p2Score);
editor.commit();
}
我正在使用共享首选项。 然后,在我的onCreate方法中,我得到了这些共享的首选项,如下所示:
// Remember scores from previous games
SharedPreferences settings = getSharedPreferences(SCORES_NAME, 0);
p1Score = settings.getInt("scoreOne", 0);
p2Score = settings.getInt("scoreTwo", 0);
updateScores();
SCORES_NAME
是public static final String SCORES_NAME = "MyScores";
这一切都不起作用。 我在游戏重新开始后的得分总是回到0。我正在考虑在rematch()
的意图中添加额外内容,但是我不确定如何在我的onCreate()
方法中访问此意图。 任何帮助是极大的赞赏!
您需要重写onSaveInstanceState(Bundle savedInstanceState)
并将要更改的应用程序状态值写入Bundle
参数,如下所示:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
// Save UI state changes to the savedInstanceState.
// This bundle will be passed to onCreate if the process is
// killed and restarted.
savedInstanceState.putInt("scoreOne", p1Score);
savedInstanceState.putInt("scoreTwo", p2Score);
// etc.
}
Bundle本质上是一种存储NVP(“名称-值对”)映射的方法,它将被传递给onCreate()
以及onRestoreInstanceState()
,您可以在其中提取如下值:
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// Restore UI state from the savedInstanceState.
// This bundle has also been passed to onCreate.
int p1Score = settings.getInt("scoreOne", 0);
int p2Score = settings.getInt("scoreTwo", 0);
}
通常,您将使用此技术来存储应用程序的实例值(选择,未保存的文本等)。
这里的问题是您假设在第一个活动的onStop()
完成执行后将调用新活动的onCreate()
。
这可能不是您要做出的假设,因为它们是两个不完全相关的事物。
将您需要的值发送到意图中的新创建的活动
public void rematch(View view) {
Intent i = getBaseContext().getPackageManager()
.getLaunchIntentForPackage( getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// Those next values will be there for sure in the new activity.
i.putExtra("scoreOne", p1Score);
i.putExtra("scoreTwo", p2Score);
finish();
startActivity(i);
}
并且在您的Activity
的onCreate中可以按以下方式提取这些值
public void onCreate(Bundle savedInstance) {
super.onCreate();
..
int p1Score = getIntent().getIntExtra("scoreOne", 0);
int p2Score = getIntent().getIntExtra("scoreTwo", 0);
}
您需要从onStop
获取代码并执行代码,然后再从rematch
方法调用finish()
。 像这样:
private void saveScores() {
SharedPreferences settings = getSharedPreferences(SCORES_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putInt("scoreOne", p1Score);
editor.putInt("scoreTwo", p2Score);
editor.commit();
}
然后从rematch
调用此函数:
(...)
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
saveScores();
finish();
startActivity(i);
但是,@ elmorabea的解决方案更好,因为您现在仅使用SharedPreferences在活动之间传递值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.