【发布时间】:2015-02-04 16:34:14
【问题描述】:
在打开的 DatePickerDialog 中,当屏幕方向改变时,它会重置选定的用户数据。
(DatePickerDialog 不会关闭,也不会维护所选数据)
代码:
public class ActivityNeki extends FragmentActivity {
DialogFragment newDF = null;
private int datY, datM, datD;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
if(savedInstanceState == null){ setTheData(); writeTheData(); }
}
@Override protected void onSaveInstanceState(Bundle outState) {
outState.putInt("izY", datY); outState.putInt("izM", datM); outState.putInt("izD", datD);
super.onSaveInstanceState(outState);
}
@Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState);
datY = savedInstanceState.getInt("izY"); datM = savedInstanceState.getInt("izM"); datD = savedInstanceState.getInt("izD");
writeTheData();
}
public void onClickOpenDPD(View view) { // the method that is caled from XML onClick
class MyDialogFragment extends DialogFragment {
@Override public void onDestroyView() {
if (getDialog() != null && getRetainInstance()) getDialog().setDismissMessage(null);
super.onDestroyView();
}
@Override public void onCreate(Bundle state) { super.onCreate(state);
setRetainInstance(true);
}
@Override public Dialog onCreateDialog(Bundle state) {
DatePickerDialog dpd = new DatePickerDialog( getActivity(), new DatePickerDialog.OnDateSetListener() {
@Override public void onDateSet(DatePicker view, int leto, int mesec, int dan) {
datY = leto; datM = mesec; datD = dan;
writeTheData();
} }, datY, datM, datD);
return dpd;
}
}
newDF = new MyDialogFragment();
newDF.show( getSupportFragmentManager(), null );
}
public void setTheData(){
Calendar c = Calendar.getInstance();
datY = c.get(Calendar.YEAR); datM = c.get(Calendar.MONTH); datD = c.get(Calendar.DAY_OF_MONTH);
}
public void writeTheData(){ /* writes the data in a txtView */ }
}
建议我,如何解决这个问题?
【问题讨论】:
-
你应该关闭它并重新打开它
-
以及如何在转动屏幕(关闭并重新打开对话框)之前获取用户设置的日期?
-
之前有过类似的问题。这里提供的解决方案看起来很优雅stackoverflow.com/a/15444485/2841101
-
如果您正在调用 setRetainInstance( true )(您显然会这样做),这实际上应该是开箱即用的。但是你应该非常小心非静态内部类,特别是如果你保留实例! stackoverflow.com/a/10968689/1493269
-
此外,Drew 的建议实际上是正确的。 setRetaininstance 甚至没有必要。 DialogFragment 能够自行恢复选定的时间!
标签: java android orientation-changes datepickerdialog