Android 当方向发生变化时,如何第一次禁用微调器上的onItemSelected?

Android 当方向发生变化时,如何第一次禁用微调器上的onItemSelected?,android,android-spinner,Android,Android Spinner,我有一个旋转器的活动。此活动将根据微调器选择从internet加载信息,并在此活动中显示。首次启动活动时,默认情况下将选择微调器。我使用SpinnersetOnItemSelectedListener,这样每次选择Spinner时,都会触发从internet加载信息的方法 @Override public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { String optio

我有一个旋转器的活动。此活动将根据微调器选择从internet加载信息,并在此活动中显示。首次启动活动时,默认情况下将选择微调器。我使用SpinnersetOnItemSelectedListener,这样每次选择Spinner时,都会触发从internet加载信息的方法

@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
    String option = (String) parent.getItemAtPosition(pos);
    loadInfoFromInternet(option);
}

使用上述解决方案,当方向改变时,信息不会再次从internet加载。这正是我想要的,但是,当我选择另一个选项时,loadInfoFromInternet将不会被触发,因为它不是一个新状态isNewState=false。这不是我想要的

你在问题中所描述的听起来很正常。在onCreate方法中,可以检查传入的Bundle参数。如果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中,以便在发生更改时将其持久化。

我注意到了一些事情。如果我将其设置为我的示例代码,在方向更改后,在我选择另一个选项后无法加载数据,因为它不在新状态。@Sam我不理解您的评论,但我相信我的代码回答了您的问题如果我仅在isNewState=true时加载数据,如果我改变手机的方向并切换到另一个选项,会发生什么?新数据将不会加载,因为isNewState=false。抱歉,顺便说一句,我不知道您打算使用isNewState的目的是什么,但您不需要它来在方向更改期间保持微调器状态。isNewState只是一个建议的解决方案。但是,这个解决方案有一个缺陷。如果我更改方向,活动将被销毁并重新创建。然后,将重新选择微调器,从internet/数据库重新加载数据,而我不希望重新加载数据,因为我希望使用存储在SaveInstanceState上的上一个状态的数据您可以使用共享首选项存储微调器值,您可以在Create方法上获得该值,这样您的值将保持不变。我不想存储微调器选择的值。我希望在方向更改后,微调器不会触发MSELECTED,因为它会使数据重新加载。我想使用存储在savedInstanceState中的数据。
@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);
}