我有Activity
Spinner
。此Activity
将根据Spinner
选项从互联网上加载信息,并在此Activity
中显示。第一次启动Activity
时,默认情况下会选择Spinner
。我使用Spinner#setOnItemSelectedListener
,以便每次选择微调器时,都会触发从互联网加载信息的方法。
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
String option = (String) parent.getItemAtPosition(pos);
loadInfoFromInternet(option);
}
当手机方向改变时,Activity
将被销毁并重新创建。我已将Spinner
信息以及我从互联网上获取的信息存储在savedInstanceState
的捆绑包中。有了它,我设法保存了Spinner
的状态和来自互联网的信息。
问题在于我从互联网上获得的信息。方向更改时,将重新创建Spinner
并选择一个选项。这将触发OnItemSelectedListener
,它将调用onItemSelected
。 loadInfoFromInternet
将再次触发。它使我存储在savedInstanceState
中的数据被替换。
我想要的是当方向发生变化时,我希望Spinner不要触发loadInfoFromInternet
,以便我可以显示之前状态的信息,而不是再次从互联网上加载。
最初,我想出了以下想法:
private boolean isNewState = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
if (savedInstanceState == null) {
isNewState = true;
}
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
String option = (String) parent.getItemAtPosition(pos);
if (isNewState) {
loadInfoFromInternet(option);
}
}
通过上述解决方案,当方向改变时,不再从因特网加载信息。这就是我想要的,但是,当我选择其他选项时,loadInfoFromInternet
将不会被触发,因为它不是新状态(isNewState = false
)。这不是我想要的。
答案 0 :(得分:0)
您在问题中描述的内容听起来正常。在onCreate()
方法中,您可以检查传入的Bundle
参数。如果包不 null
,那么您可以假设您已保存状态对于您的微调器,您可以加载该状态。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
if (savedInstanceState == null) {
isNewState = true;
}
else {
int sIndex = savedInstanceState.getInt("S_INDEX");
Spinner spinner = (Spinner) findViewById(R.id.yourSpinner);
spinner.setSelection(S_INDEX);
}
}
并向onSaveInstanceState()
添加逻辑以保存微调器的索引状态:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
Spinner spinner = (Spinner) findViewById(R.id.yourSpinner);
int sIndex = spinner.getSelectedItemPosition();
savedInstanceState.putInt("S_INDEX", sIndex);
}
请注意,每次手机更改方向时都会调用onSaveInstanceState()
。您需要做的就是将活动状态存储在Bundle
中,以便在更改后保留活动状态。