0

私のアプリケーションでは、クラスメンバーの値、たとえば、をデフォルト値の。に初期化するaSpinnerがあります。次に、ユーザーはの値を変更する手順を実行できます。の値を保存し、で復元しています。ただし、明らかに、の復元の結果として、が呼び出されてゼロに戻ります。ユーザーが入力した値を保持したい。onItemSelecteda0aaonSaveInstanceStateonRestoreInstanceStateSpinneronItemSelecteda

ただし、の古い値は、 (したがって、アイテムの選択時にゼロにする)aの他の設定では意味がないことに注意してください。Spinner残念ながら、それを検証することも困難です。したがって、への呼び出しonItemSelectedが偽物であることを知らずにa、ゼロにすることは避けられません。

問題は、入力イベントハンドラーがキューに入れられ、 /が終了した後 に呼び出されるように見えることです(2回、これは私が理解していないもう1つのことです)。したがって、私の質問は、保存されたインスタンスの状態からデフォルト以外の値に復元する必要があるのはいつですか?どういうわけか、このタスクを入力イベントキューの最後に配置する必要がありますか?または、呼び出しが実際のユーザー入力の結果として発生したのか、インスタンス状態の復元のみの結果として発生したのかを区別する方法はありますか?onCreateonRestoreInstanceStateaonItemSelected

コード例:

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

私はあなたの質問であなたが言ったことすべてに従わなかったことを認めなければなりませんが、スピナーの選択を復元するのは簡単です:

  1. あなたのonItemSelected()使用で: a = position,
  2. onRestoreInstanceState()通話終了時spinner.setSelection(a);

Spinner がその選択を変更するたびonItemSelected()に、内部を含め、Spinner が を呼び出すことを理解してonRestoreInstanceState()ください。aただし、現在の選択を維持しているため、これは問題ではありません。

于 2012-10-17T21:31:03.907 に答える
0

これが私がこれまでに思いついたものです。onItemSelected単なる観察で見つかった 2 つの呼び出しを数えることなく、トリックを実行します。ただし、私はまだ回避策と考えています。

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 に答える
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 に答える