具有DatePicker回调的片段中的非默认构造函数

时间:2015-04-17 14:25:05

标签: android android-fragments android-datepicker

有关如何通过创建newInstance方法来避免此问题的答案,但是当我发送listener作为参数并且我无法通过{{1}发送listener时我该如何解决这个问题呢?

此处我有Bundle 收听日历更改

interface

我在 public interface DateChangeListener { public void onDateChanged(Calendar calendar); } 开启DatePicker DialogFragment

(为清晰起见:有一个Fragment我在某个按钮点击时创建Fragment,然后在Custom AlertDialog内打开Dialog初始化DialogFragment(mDatePicker)

DatePickerFragment

这里创建了DialogFragment mDatePicker = new DatePickerFragment(new DateChangeListener() { @Override public void onDateChanged(Calendar calendar) { year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH); day = calendar.get(Calendar.DAY_OF_MONTH); //Set date filtersInputEditText.setText(new StringBuilder().append(day).append("/").append(month + 1).append("/").append(year)); }

DialogFragment

代码运行良好,但是当我尝试制作 public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { private DateChangeListener mListener; public DatePickerFragment(DateChangeListener mListener){ this.mListener = mListener; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the current date as the default date in the picker final 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(), android.R.style.Theme_Holo_Light_Dialog, this, year, month, day); } @Override public void onDateSet(DatePicker view, int year, int month, int day) { Calendar calendar = Calendar.getInstance(); calendar.set(year, month, day); if(mListener != null) mListener.onDateChanged(calendar); } } 时,它会通过signed apk消息向我发出警告。我如何在这里使用non-default constructor策略,还是应该改变我实现此功能的方式?

另请注意,我强迫应用将newInstance保留为orientation landscapeManifest

2 个答案:

答案 0 :(得分:2)

  1. 片段应该有空构造函数如果您不希望更改配置问题,例如屏幕旋转或内存不足。当配置更改时,Android将自动使用空构造函数重新创建Fragment。

  2. 针对您的情况。 DateChangeListener应该由

    实现
    • 主机活动 - 如果您从活动

    • 打开DatePickerFragment
    • TargetFragment(通过设置Fragment中的setTargetFragment) - 如果从Fragment打开DatePickerFragment(如父片段)

  3. 从DatePickerFragment,您可以通过转换访问DateChangeListener,如下所示:

    • (DateChangeListener)this.getActivity()---->如果主机活动实现DateChangeListener

    • (DateChangeListener)this.getTargetFragment()--->如果父片段(setTargetFragment)实现DateChangeListener

答案 1 :(得分:0)

我建议您使用总线(如Otto)。使用接口时,您将实现接口的类与使用该接口的类耦合。使用总线避免了这种情况,因为订阅者不知道事件的来源。

您收到警告的原因是框架可能需要重新创建Fragment(例如,当您旋转屏幕时)。当它这样做时,FragmentManager将调用Fragment的默认构造函数,因此不会调用非默认构造函数。