我使用DialogFragment创建一个DatePickerDialog,如下所示:
public class DatePickerFragment extends DialogFragment
implements DatePickerDialog.OnDateSetListener {
public static final String TAG = DatePickerFragment.class.getSimpleName();
public interface OnDateUpdateListener{
public void onDateUpdate(int year, int month, int day);
}
private OnDateUpdateListener mOnDateUpdateListener;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// after screen rotation, the following code is no meaningful and leak memory here
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
//
OnDateUpdateListener iOnDateUpdateListener = (OnDateUpdateListener)getTargetFragment();
if(iOnDateUpdateListener != null){
iOnDateUpdateListener.onDateUpdate(year, month, day);
}
}
}
我添加了源代码以防止在配置更改时再次创建DialogFragment,请参阅以下代码:
mBtnDatePicker.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(isDialogShow() == true){
return;
}
FragmentManager fm = getFragmentManager();
DatePickerFragment iDatePickerFragment = (DatePickerFragment)fm.findFragmentByTag(TAG_DATEPICKER);
if(iDatePickerFragment ==null){
iDatePickerFragment = new DatePickerFragment();
iDatePickerFragment.setTargetFragment(FragmentInput.this,0);
//add to FragmentManager
iDatePickerFragment.show(getFragmentManager(), TAG_DATEPICKER);
}
}
});
第1步:显示此对话框=> onCreateDialog被称为
第2步:在DatePicker中更改日期
第3步:旋转屏幕=> onCreateDialog再次被召回。但保留了步骤2中的日期更改,并且未更新onCreateDialog中的日期。此步骤中的源代码没有意义,并在此处分配内存。
我的问题:
请帮我解释一下
如果我想将日期重置为当前日期或将日期设置为" step2",我该怎么办?
答案 0 :(得分:0)
当配置更改发生时,旧片段不会被销毁 - 它会在重新创建时将其自身添加回活动
i: 3
答案 1 :(得分:0)
也许在调用onCreateDialog()之后,Date被更改为Screen Rotation之前的值。 我试着在onResume()函数中添加源代码更新日期,没关系:
@Override
public void onResume() {
super.onResume();
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
mDialog.getDatePicker().updateDate(year, month, day);
}