我在使用onSavedInstanceState只有一组变量时面临一个奇怪的问题。我正在研究一个craps游戏应用程序,我想在设备的方向变化之间保存骰子图像。保存在第一次定向机会(垂直到水平)时成功,但在第一次更改后立即从水平返回到垂直(第二次方向更改)将重置我的骰子图像,但没有别的。此外,如果我在第一次方向改变后玩游戏,那么它的状态将完美地保留用于第二次方向改变。
通过调试,我发现携带我的骰子状态的变量(lastDie1和lastDie2)将在第一次和第二次方向改变之间重置(可能重新初始化)。它们的值从以前的变化(整数引用可绘制资源)变为零。我不知道为什么,我会感激任何帮助。
以下是与我的应用程序的不同部分有关的代码。
声明变量以保存dice的状态。我将它们声明为字段。他们有一个班级范围。
private int lastDie1;
private int lastDie2;
这是将die1状态分配给lastDie1变量的代码的一部分。此代码是模拟骰子卷的方法的一部分。
switch (di1) {
case 1:
die1ImageResource.setImageResource(R.drawable.die1);
lastDie1 = R.drawable.die1;
break;
case 2:
die1ImageResource.setImageResource(R.drawable.die2);
lastDie1 = R.drawable.die2;
break;
case 3:
die1ImageResource.setImageResource(R.drawable.die3);
lastDie1 = R.drawable.die3;
break;
case 4:
die1.setImageResource(R.drawable.die4);
lastDie1 = R.drawable.die4;
break;
case 5:
die1ImageResource.setImageResource(R.drawable.die5);
lastDie1 = R.drawable.die5;
break;
case 6:
die1ImageResource.setImageResource(R.drawable.die6);
lastDie1 = R.drawable.die6;
break;
}
这是我的onSavedInstanceState()方法的代码
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
int lDie1 = lastDie1;
int lDie2 = lastDie2;
int mPoints = winCount;
int hPoints = loseCount;
int resColor = resultsTextView.getCurrentTextColor();
String reTextView = resultsTextView.getText().toString();
String pTextView = pointsTextView.getText().toString();
String roTextView = rollTextView.getText().toString();
outState.putInt("DIE1_STATE", lDie1);
outState.putInt("DIE2_STATE", lDie2);
outState.putInt("MY_POINTS", mPoints);
outState.putInt("HOUSE_POINTS", hPoints);
outState.putInt("RESULTS_COLOR", resColor);
outState.putString("RESULTS", reTextView);
outState.putString("POINTS", pTextView);
outState.putString("ROLL", roTextView);
}
这是恢复onCreate方法
状态的代码部分if ( savedInstanceState == null ) // the app just started running
{
winCount = 0;
loseCount = 0;
resultsTextView.setTextColor(Color.BLACK);
}
else
{
winCount = savedInstanceState.getInt("MY_POINTS");
loseCount = savedInstanceState.getInt("HOUSE_POINTS");
die1.setImageResource(savedInstanceState.getInt("DIE1_STATE"));
die2.setImageResource(savedInstanceState.getInt("DIE2_STATE"));
resultsTextView.setTextColor(savedInstanceState.getInt("TEXT_COLOR"));
resultsTextView.setText(savedInstanceState.getString("RESULTS"));
pointsTextView.setText(savedInstanceState.getString("POINTS"));
rollTextView.setText(savedInstanceState.getString("ROLL"));
}
正如我所说的其他一切正常工作并且他们的状态无缝延续但是lastDie1和lastDie2似乎重新初始化而他们不应该因为他们是像我的其他变量winCount和loseCount这样的字段。
答案 0 :(得分:0)
感谢用户ajb @ajb我可以解决这个问题,现在应用程序正在以它应该的方式工作。这是解决方案。更新后的代码也已发布
来自评论
重新处理savedInstanceState的代码分配给winCount和loseCount,但是我没有看到任何分配给lastDie1或lastDie2的内容。 - ajb
lastDie1和lastDie2的值在onSavedInstanceState方法中与DIE1_STAT和DIE2_STAT配对,然后我使用onCreate中的键恢复图像状态 - Zimex
他们没有“配对”。 onSaveInstanceState使用lastDie1的值作为名为DIE1_STAT的值,因为您给它赋值并告诉它将其保存为DIE1_STAT。它没有注意到或记住它从中获取值的变量的名称。 Java不像那样工作。 - ajb
if ( savedInstanceState == null ) // the app just started running
{
winCount = 0;
loseCount = 0;
resultsTextView.setTextColor(Color.BLACK);
}
else
{
winCount = savedInstanceState.getInt("MY_POINTS");
loseCount = savedInstanceState.getInt("HOUSE_POINTS");
lastDie1 = savedInstanceState.getInt("DIE1_STATE");
lastDie2 = savedInstanceState.getInt("DIE2_STATE");
die1ImageView.setImageResource(lastDie1);
die2ImageView.setImageResource(lastDie2);
resultsTextView.setText(savedInstanceState.getString("RESULTS"));
pointsTextView.setText(savedInstanceState.getString("POINTS"));
rollTextView.setText(savedInstanceState.getString("ROLL"));
}