有关如何通过创建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
landscape
,Manifest
答案 0 :(得分:2)
片段应该有空构造函数如果您不希望更改配置问题,例如屏幕旋转或内存不足。当配置更改时,Android将自动使用空构造函数重新创建Fragment。
针对您的情况。 DateChangeListener应该由
实现主机活动 - 如果您从活动
TargetFragment(通过设置Fragment中的setTargetFragment) - 如果从Fragment打开DatePickerFragment(如父片段)
从DatePickerFragment,您可以通过转换访问DateChangeListener,如下所示:
(DateChangeListener)this.getActivity()---->如果主机活动实现DateChangeListener
(DateChangeListener)this.getTargetFragment()--->如果父片段(setTargetFragment)实现DateChangeListener
答案 1 :(得分:0)
我建议您使用总线(如Otto)。使用接口时,您将实现接口的类与使用该接口的类耦合。使用总线避免了这种情况,因为订阅者不知道事件的来源。
您收到警告的原因是框架可能需要重新创建Fragment
(例如,当您旋转屏幕时)。当它这样做时,FragmentManager
将调用Fragment
的默认构造函数,因此不会调用非默认构造函数。