屏幕旋转后保留监听器 - 使用DatePicker的DialogFragment

Chr*_*ina 4 android listener orientation-changes android-dialogfragment dialogfragment

单击我的(Scherlock)FragmentActivity中的EditText字段时,将显示DatePicker.选择日期并单击"应用"后,将使用日期填充Edittext字段.这可以正常工作,直到我在DatePicker可见时旋转屏幕.它的onCreateDialog方法再次启动,一切看起来都正确.但是,当我单击"应用"时,EditText字段中没有填写任何日期.

这很可能是因为我没有设法保留听众.这个问题与DialogFragment非常相似- 在屏幕旋转后保留监听器但是在我的代码中我有一个DialogFragment中包含的监听器接口,我无法通过调用FragmentActivity来达到监听器,(正如解决方案在上述问题中所建议的那样).

  • 我想不是,但有没有办法在活动被销毁之前保存一个监听器?(我对Manifest修改不感兴趣.)
  • 有没有办法修改这个DialogFragment,或者这个解决方案是否包含在这种情况下不适合的接口?

请帮助我,这真的不应该那么难,但我一直在使用它的时间比我承认的还要长......

这是DialogFragment代码:

public class DateDialogFragment extends SherlockDialogFragment {    

public static String TAG = "DateDialogFragment";
static Context mContext; 
static int mYear;
static int mMonth;
static int mDay;
static DateDialogFragmentListener mListener;


public static DateDialogFragment newInstance(Context context, DateDialogFragmentListener listener, Calendar now) {
    DateDialogFragment dialog = new DateDialogFragment();
    mContext = context;
    mListener = listener;       
    mYear = now.get(Calendar.YEAR);
    mMonth = now.get(Calendar.MONTH);
    mDay = now.get(Calendar.DAY_OF_MONTH);      
    return dialog;
}


public Dialog onCreateDialog(Bundle savedInstanceState) {
    return new DatePickerDialog(mContext, mDateSetListener, mYear, mMonth, mDay);
}


private OnDateSetListener mDateSetListener = new OnDateSetListener() {      
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        mYear = year;
        mMonth = monthOfYear;
        mDay = dayOfMonth;          
        mListener.updateChangedDate(year, monthOfYear, dayOfMonth);
    }
};


public interface DateDialogFragmentListener {
    public void updateChangedDate(int year, int month, int day);
}

}
Run Code Online (Sandbox Code Playgroud)

编辑:这是我的FragmentActivity的一部分:我用来调用DialogFragment的方法:

public void showDatePickerDialog() {    
    now = Calendar.getInstance();   
    DateDialogFragment frag = DateDialogFragment.newInstance(
            this, new DateDialogFragment.DateDialogFragmentListener() {
        public void updateChangedDate(int year, int month, int day) {
            birthdate.setText(String.valueOf(day) + "-" + String.valueOf(month+1) + "-" +  String.valueOf(year));                               
            now.set(year, month, day);
            pet.setBirthdate(birthdate.getText().toString());
        }
    }, 
    now);
    frag.show(getSupportFragmentManager(), "DateDialogFragment");   
}   
Run Code Online (Sandbox Code Playgroud)

Ash*_*jan 6

我遇到了同样的问题.这是解决方案,来自Luksprog.它对我来说很完美.

if (savedInstanceState != null) {
    DatePickerFragment dpf = (DatePickerFragment) getSupportFragmentManager()
            .findFragmentByTag("theTag?");
    if (dpf != null) {
        dpf.setListener(listener);
    }
}
Run Code Online (Sandbox Code Playgroud)

并且不需要像上面的答案中提到的那样包裹片段......