当我在我的(Scherlock)FragmentActivity中单击EditText字段时,会显示一个DatePicker。选择日期并点击“应用”后,Edittext字段将填充日期。这很好用,直到我旋转屏幕时DatePicker可见。它的onCreateDialog方法重新启动,一切看起来都没问题。但是当我点击“应用”时,没有日期填写到EditText字段中。
这很可能是因为我没有成功保留侦听器。这个问题非常类似于DialogFragment - retaining listener after screen rotation ,但是在我的代码中,我在DialogFragment中包含了一个侦听器接口,并且我无法从调用的FragmentActivity中访问该侦听器(如所提出的解决方案所建议的那样)。
以下是DialogFragment代码:
这很可能是因为我没有成功保留侦听器。这个问题非常类似于DialogFragment - retaining listener after screen rotation ,但是在我的代码中,我在DialogFragment中包含了一个侦听器接口,并且我无法从调用的FragmentActivity中访问该侦听器(如所提出的解决方案所建议的那样)。
- 我认为不行,但是在活动被销毁之前有保存侦听器的方法吗?(我对清单修改不感兴趣。)
- 有没有办法修改这个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);
}
}
编辑:这是我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");
}
onSaveInstanceState
并使用 bundleoutState.putString("key1", editextvalue)
,然后在onActivityCreated
中使用以下代码if( savedInstanceState!=null) { editextvalue = savedInstanceState.getString("key1")}
。现在将此内容用于设置到editext中。 - Raghunandan