我正面臨一個使用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()方法的代碼
@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似乎得到重新初始化,而他們不應該,因爲他們是像我的其他變量字段w inCount和loseCount。
您的switch語句是否在創建活動時執行?除非您在AndroidManifest中禁用onCreate,否則onCreate將在輪換時再次執行。如果是,那麼除非你明確檢查它們是否被設置,否則它們將被重新初始化。 –
我會建議存儲圖像的名稱,而不是存儲圖像的可繪製int值。您稍後可以執行getDrawables(圖像名稱)以恢復狀態。同樣適用於顏色值也 – harshal
您的代碼重新處理'savedInstanceState'分配給'winCount'和'loseCount',但我沒有看到任何分配給'lastDie1'或'lastDie2'的東西。 – ajb