更改屏幕方向时如何保存字符串数组的随机位置?

时间:2014-03-28 12:51:33

标签: java android arrays random

我无法解释我想通过标题说什么,但我会在这里扩展。

无论如何,我还在学习如何编码,以免我滥用一些条款。

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

事实是,当我改变方向时,显示的水果会发生变化。我知道发生这种情况是因为每当方向改变时,活动都会被“重新制作”。我对如何使用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]);

        }

    });

4 个答案:

答案 0 :(得分:0)

试试这个代码段:

@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");
  }
}

您可以使用onCreate()而不是在onRestoreInstanceState()中恢复数据。这里解释了不同之处:onSaveInstanceState () and onRestoreInstanceState ()

答案 1 :(得分:0)

您可以尝试定义generatedIndex static globaly,也可以使用首选项保存随机数。

将您的价值保存在偏好设置中,如下所示: -

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

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

答案 2 :(得分:0)

首先,您需要@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 :(得分:0)

因为您将水果名称存储在数组中,所以可以存储调用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);
    }
}