Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在设备方向更改时重新初始化实例变量?_Java_Android_Oncreate - Fatal编程技术网

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

Java 在设备方向更改时重新初始化实例变量?,java,android,oncreate,Java,Android,Oncreate,使用onSavedInstanceState时,我面临一个奇怪的问题,因为它只包含一组变量。我正在开发一个骰子游戏应用程序,我想在设备的方向改变之间保存骰子图像。第一次定向机会(垂直到水平)保存成功,但在第一次更改后立即从水平返回到垂直(第二次定向更改)将重置我的骰子图像,但除此之外没有其他设置。另外,如果我在第一次方向改变后玩游戏,那么它的状态将在第二次方向改变时得到完美的保留 通过调试,我发现携带骰子状态的变量(lastDie1和lastDie2)将在第一次和第二次方向更改之间重置(可能重新

使用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"));


      }