我无法解释我想通过标题说什么,但我会在这里扩展。
无论如何,我还在学习如何编码,以免我滥用一些条款。
我制作了一个显示字符串数组的简单应用程序。它只有两个可视部分 - 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]);
}
});
答案 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); } }