我正在制作一个双人游戏,我可以进行复赛。我也跟踪每个球员的得分。这就是我的复赛代码:
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()
方法中访问此意图。非常感谢任何帮助!
答案 0 :(得分:0)
您需要覆盖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);
}
您通常会使用此技术来存储应用程序的实例值(选择,未保存的文本等)。
答案 1 :(得分:0)
问题在于您假设在第一个活动onCreate()
完成执行后将调用新活动的onStop()
。
这可能不是你想做的假设,因为它们是两个不完全相关的东西。
将您需要的值发送到意图
中新创建的活动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);
}
答案 2 :(得分:0)
您需要从onStop
获取代码并在从finish()
方法调用rematch
之前执行该代码。像这样:
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在活动之间传递值。