0

在我的应用程序中,我有一个将类成员的值(比如 )初始化Spinner为其默认值。然后,用户可以执行步骤来更改 的值。我正在保存in的值并将其恢复为. 但是,显然由于恢复了,它被调用并归零。我希望保留用户输入的值。onItemSelecteda0aaonSaveInstanceStateonRestoreInstanceStateSpinneronItemSelecteda

但是请注意,旧值a在 的任何其他设置中都没有意义Spinner(因此在选择项目时将其归零)。不幸的是,它也很难验证。因此,不知道调用onItemSelected是假的,将a其归零是不可避免的。

问题是输入事件处理程序似乎被放入某个队列并 onCreate/onRestoreInstanceState完成后调用(两次,这是我不明白的另一件事)。因此,我的问题是,我应该在什么时候a从保存的实例状态恢复到非默认值?我应该以某种方式将此任务放在输入事件队列的末尾吗?或者有没有办法区分调用是onItemSelected由于实际用户输入还是仅仅是实例状态恢复而发生的?

代码示例:

private String KEY = "(...).A";
private int a;

public void onItemSelected(AdapterView<?> parentView, View childView, int position, long id) {
  /* other important stuff */
  a = 0;
  Log.d("info", "a zeroed");
}

public void onSaveInstanceState(Bundle state) {
  super.onSaveInstanceState(state);
  state.putInt(KEY, a);
}

public void onRestoreInstanceState(Bundle state) {
  super.onRestoreInstanceState(state);
  a = state.getInt(KEY, a);
  Log.d("info", "a restored");
}

改变方向后,日志说

info  a restored
info  a zeroed
info  a zeroed
4

3 回答 3

1

我必须承认,我没有按照您在问题中所说的所有内容进行操作,但是恢复 Spinner 的选择很容易:

  1. 在您的onItemSelected()使用中:a = position,
  2. onRestoreInstanceState()通话结束时spinner.setSelection(a);

了解每次Spinner 更改其选择时 Spinner 调用onItemSelected(),包括内部onRestoreInstanceState()。但是,由于您保持a设置为当前选择,因此这不是问题。

于 2012-10-17T21:31:03.907 回答
0
private boolean trigger = false;
public void onItemSelected(AdapterView<?> parentView, View childView, int position, long id) {
if (trigger){
    a = 0;
   Log.d("info", "a zeroed");
} else trigger = true;
}

它看起来像最简单的解决方案

于 2012-10-17T21:29:55.150 回答
0

到目前为止,这是我想出的。它可以做到这一点,而无需计算onItemSelected仅通过观察发现的两次调用。但是,我仍然认为这是一种解决方法:

private String KEY = "(...).A";
private String SEL = "(...).SEL";
private int a;
private int sel = -1;

public void onItemSelected(AdapterView<?> parentView, View childView, int position, long id) {
  /* other important stuff */
  if(position != sel) {
    a = 0;
    Log.d("info", "a zeroed");
    sel = position;
  } else
    Log.d("info", "a kept");
}

public void onSaveInstanceState(Bundle state) {
  super.onSaveInstanceState(state);
  state.putInt(KEY, a);
  state.putInt(SEL, sel);
}

public void onRestoreInstanceState(Bundle state) {
  super.onRestoreInstanceState(state);
  a = state.getInt(KEY);
  sel = state.getInt(SEL);
  Log.d("info", "a restored");
}

改变方向后,日志现在显示

info  a restored
info  a kept
info  a kept

这个解决方案的坏处是在 还没有初始化a的时候就有它的价值Spinner,这暂时不会造成问题,但永远不应该发生。一个适当的解决方案应该让其onItemSelected完成所有工作并a在此之后进行设置。

于 2012-10-17T22:32:20.567 回答