2014-02-27 20 views
0

我正面臨一個使用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。

+0

您的switch語句是否在創建活動時執行?除非您在AndroidManifest中禁用onCreate,否則onCreate將在輪換時再次執行。如果是,那麼除非你明確檢查它們是否被設置,否則它們將被重新初始化。 –

+0

我會建議存儲圖像的名稱,而不是存儲圖像的可繪製int值。您稍後可以執行getDrawables(圖像名稱)以恢復狀態。同樣適用於顏色值也 – harshal

+0

您的代碼重新處理'savedInstanceState'分配給'winCount'和'loseCount',但我沒有看到任何分配給'lastDie1'或'lastDie2'的東西。 – ajb

回答

0

感謝用戶ajb @ajb我可以解決這個問題,現在應用程序正在按照它應該的方式工作。這是解決方案。更新後的代碼也貼出

從評論

你的代碼來重新處理savedInstanceState分配給winCount和loseCount,但我沒有看到任何分配給lastDie1或lastDie2。 - AJB

爲lastDie1和lastDie2價值得到與DIE1_STAT和DIE2_STAT配對在onSavedInstanceState方法,然後我使用的密鑰在的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")); 


     }