Java 在设备方向更改时重新初始化实例变量?
使用onSavedInstanceState时,我面临一个奇怪的问题,因为它只包含一组变量。我正在开发一个骰子游戏应用程序,我想在设备的方向改变之间保存骰子图像。第一次定向机会(垂直到水平)保存成功,但在第一次更改后立即从水平返回到垂直(第二次定向更改)将重置我的骰子图像,但除此之外没有其他设置。另外,如果我在第一次方向改变后玩游戏,那么它的状态将在第二次方向改变时得到完美的保留 通过调试,我发现携带骰子状态的变量(lastDie1和lastDie2)将在第一次和第二次方向更改之间重置(可能重新初始化)。它们的值从以前的值(整数表示可绘制资源)更改为零。我不知道为什么,我会感激任何帮助 以下是与我的应用程序的不同部分相关的代码 声明变量以保存骰子的状态。我将它们声明为字段。它们有一个类范围Java 在设备方向更改时重新初始化实例变量?,java,android,oncreate,Java,Android,Oncreate,使用onSavedInstanceState时,我面临一个奇怪的问题,因为它只包含一组变量。我正在开发一个骰子游戏应用程序,我想在设备的方向改变之间保存骰子图像。第一次定向机会(垂直到水平)保存成功,但在第一次更改后立即从水平返回到垂直(第二次定向更改)将重置我的骰子图像,但除此之外没有其他设置。另外,如果我在第一次方向改变后玩游戏,那么它的状态将在第二次方向改变时得到完美的保留 通过调试,我发现携带骰子状态的变量(lastDie1和lastDie2)将在第一次和第二次方向更改之间重置(可能重新
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()方法的代码
下面是恢复onCreate方法状态的代码部分
@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);
}
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类似的字段 多亏了用户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
创建活动时是否执行switch语句?除非在AndroidManifest中禁用onCreate,否则onCreate将在循环时再次执行。如果是,除非您明确检查它们是否已设置,否则它们将重新初始化。我建议存储图像的名称,而不是存储图像的可绘制int值。您可以稍后执行getDrawables(图像名称)来恢复状态。颜色值也同样适用于重新处理
savedInstanceState
分配给winCount
和loseCount
的代码,但我没有看到分配给lastDie1
或lastDie2
@razzaps的任何内容。不,该开关是一个方法的一部分,按下按钮就会被调用。它不是创建时的一部分。按钮也不是onCreate的一部分。@ajb lastDie1和lastDie2的值与onSavedInstanceState方法中的DIE1_STAT和DIE2_STAT配对,然后我使用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");
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"));
}