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

这很可能是因为我没有设法留住听众。此问题与 DialogFragment - retaining listener after screen rotation 非常相似,但是在我的代码中,DialogFragment 中包含一个监听器接口(interface),但我无法通过调用 FragmentActivity 来访问监听器(正如上述问题中的解决方案所建议的那样)。

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

  • 请帮助我,这真的不应该那么难,但我已经使用它的时间比我承认的要长......

    这是 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");
    }
    

    最佳答案

    我遇到了同样的问题。这是解决方案 from Luksprog 。它非常适合我。

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

    并且不需要像上面的答案中提到的那样打包 fragment ......

    关于android - 屏幕旋转后保留监听器 - DialogFragment 与 DatePicker,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19111839/

    10-12 00:34