在设备方向更改时重新初始化的实例变量?

时间:2014-02-27 20:00:26

标签: java android oncreate

我在使用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这样的字段。

1 个答案:

答案 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"));


      }