AlertDialog
withDialogFragment
は、デバイスの回転後にデータ (テキスト ビューで編集されたテキスト、単一選択で選択された要素) を復元します。また、マルチチョイス モードでチェックされたアイテムは復元されません。正確に言うと、 で開始されたフィールドを記憶しfalse
、常に で開始されたフィールドをリセットしますtrue
(回転後に true にリセットされます)。
それは非常に奇妙です、私は何を間違っていますか? すべてのデータを復元したい (特に、すべてのビューがダイアログ自体によって管理されている場合)。
UPD 1 : ダイアログ内の UI とのユーザー インタラクションを追跡し、バンドルまたは静的変数のダイアログ/フラグメント インスタンス間で保存できることを実際に理解しています。しかし、それはすでにカスタムレイアウトの状態(編集テキスト+チェックボックス)と単一選択の選択を単独で保存することに成功しています。そして、同様のコードで間違った動作をするのはマルチチョイスだけです。それが私が理解したいことです。
以下の動作デモ。Nexus 5 / Android 4.4.2 でテスト済み
メソッドを 1 つだけ実装したアクティビティ
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button single = (Button) findViewById(R.id.single);
single.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
df_single newDialog = new df_single();
newDialog.show(MyActivity.this.getFragmentManager(), "dialog");
}
});
Button multi = (Button) findViewById(R.id.multi);
multi.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
df_multi newDialog = new df_multi();
newDialog.show(MyActivity.this.getFragmentManager(), "dialog");
}
});
}
レイアウトです
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button android:id="@+id/single" android:layout_width="200dp" android:layout_height="wrap_content" android:text="list single"/>
<Button android:id="@+id/multi" android:layout_width="200dp" android:layout_height="wrap_content" android:text="list multi"/>
単一選択のDialogFragment
public class df_single extends DialogFragment {
public df_single() { }
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Single");
String[] items = new String[]{"1", "2", "3", "4", "5"};
builder.setSingleChoiceItems(items, 1, null);
return builder.create();
}
}
複数選択のDialogFragment
public class df_multi extends DialogFragment {
public df_multi() { }
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Multi");
String[] items = new String[]{"1", "2", "3", "4", "5"};
boolean[] checked = new boolean[]{true, false, true, false, true};
builder.setMultiChoiceItems(items, checked, null);
Dialog answer = builder.create();
return answer;
}
}