使用DatePickerDialog的DialogFragment不会在屏幕旋转后更改内容并在onCreateDialog()中泄漏内存

时间:2016-05-18 13:09:44

标签: android

我使用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中的日期。此步骤中的源代码没有意义,并在此处分配内存。

我的问题:

  1. 请帮我解释一下

  2. 如果我想将日期重置为当前日期或将日期设置为" step2",我该怎么办?

2 个答案:

答案 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);
}