【问题标题】:How do I save the random position of a String Array when changing screen orientations?更改屏幕方向时如何保存字符串数组的随机位置?
【发布时间】:2014-03-28 12:51:32
【问题描述】:

我无法通过标题真正解释我想要表达的意思,但我会在这里展开。

无论如何,我仍在学习如何编码,所以请原谅我误用了一些术语。

我制作了一个显示字符串数组的简单应用程序。它只有两个视觉部分——一个 TextView 元素和一个 Button 元素。按下按钮会显示字符串数组中的随机水果。

问题是,当我改变方向时,显示的水果会发生变化。我知道发生这种情况是因为只要方向改变,活动就会“重新制作”。而且我确实了解如何使用 onSaveInstanceState 及其对应物。

但我不知道如何在 Display 中保存和恢复当前显示的值,因为我使用的是 Random 而不是 int。因此,我认为我不能依赖使用 putInt 和 getInt。

TextView Display;
Button randomize;
String[] fruitArray;
Random counter = new Random();
Random rand = new Random();
int launchCounter = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    initializeButtons();
    checkAndroidVersion();
    changeFont();

    fruitArray= getResources().getStringArray(R.array.fruits);

    launchCounter = rand.nextInt(10) + 1;

    Display.setText(fruitArray[launchCounter]);

    randomize.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            int maxIndex = jokeArray.length;
            int generatedIndex = counter.nextInt(maxIndex);
            Display.setText(fruitArray[generatedIndex]);

        }

    });

【问题讨论】:

    标签: java android arrays random


    【解决方案1】:

    试试这个 sn-p:

    @Override    
    protected void onSaveInstanceState(Bundle icicle) {
      super.onSaveInstanceState(icicle);
      icicle.putString("position", launchCounter);
    }
    And restore the values in onCreate():
    
    @Override
    public void onCreate(Bundle icicle) {
      ...
      if (icicle != null){
        value = icicle.getString("position");
      }
    }
    

    您可以使用onRestoreInstanceState(),而不是恢复onCreate() 中的数据。此处解释了差异:onSaveInstanceState () and onRestoreInstanceState ()

    【讨论】:

      【解决方案2】:

      首先,您需要 @Override 您的 onSaveInstanceState 方法。您可以为您的代码执行以下操作。

      // This bundle will be passed to your onCreate method when it is called
      @Override
      public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        savedInstanceState.putInt( "LaunchCounter", launchCounter );
      }
      

      现在你在哪里定义这条线:

      launchCounter = rand.nextInt(10) + 1;
      

      您应该将其替换为以下内容:

      // If this is re-creating then it will not be null.         
      // If it has just been initialised, it will be.
      if ( savedInstanceState != null ) 
      {
          launchCounter = savedInstanceState.getInt( "LaunchCounter" );
      } 
      else 
      {
          launchCounter = rand.nextInt(10) + 1;
      }
      

      您可以将硬编码字符串替换为 static String 引用。

      【讨论】:

        【解决方案3】:

        您可以尝试全局定义 generateIndex 静态,也可以使用首选项来保存随机数。

        在首选项中保存您的价值,如下所示:-

        SharedPreferences mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
        mSharedPrefs.edit().putInt("KEY", generatedIndex).commit();
        

        在 onCreate 期间,您可以使用 mSharedPrefs.getInt("KEY", "") 取回保存的值并将其显示在 TextView 中。

        【讨论】:

          【解决方案4】:

          由于您将水果名称存储在数组中,因此您可以在调用 onSaveInstanceState 时存储当前显示的水果的数组索引。在 onRestoreInstanceState 中,您可以使用 getInt (String key, int defaultValue) 检索当前水果的索引。

          如果在不存在保存的实例状态的情况下将 -1 分配给水果索引变量,如果在保存的实例状态中没有存储任何内容,则将其指定为默认值,然后您可以简单地生成一个新的随机索引,如果变量为 -1,如果不是,则将正确的文本分配给 TextView。

          public class MainActivity extends Activity {
          
             TextView labelFruit;
             Button buttonCycle;
          
             String[] fruitArray;
             Random rand = new Random();
             int fruitIndex = -1;
          
              @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_main);
          
                  fruitArray = getResources().getStringArray(R.array.fruits);
          
                  labelFruit = (TextView) findViewById(R.id.text_fruit);
                  buttonCycle = (Button) findViewById(R.id.button_cycle);
          
                  buttonCycle.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View view) {
                          fruitIndex = rand.nextInt(fruitArray.length);
                          labelFruit.setText(fruitArray[fruitIndex]);
                      }
                  });
              }
          
              @Override
              protected void onRestoreInstanceState(Bundle savedInstanceState) {
                  super.onRestoreInstanceState(savedInstanceState);
          
                  if (savedInstanceState == null) {
                      fruitIndex = -1;
                  } else {
                      fruitIndex = savedInstanceState.getInt("FRUIT_INDEX", -1);
                  }
          
                  if (fruitIndex == -1) {
                      fruitIndex = rand.nextInt(fruitArray.length);
                  }
          
                  labelFruit.setText(fruitArray[fruitIndex]);
              }
          
              @Override
              protected void onSaveInstanceState(Bundle outState) {
                  super.onSaveInstanceState(outState);
          
                  outState.putInt("FRUIT_INDEX", fruitIndex);
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-07-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多