存在关于如何通过创建newInstance
方法来避免此问题的答案,但是由于我正在发送listener
作为参数,并且无法通过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
保留为android:screenOrientation="landscape"
最佳答案
片段应具有Empty构造函数。如果您不希望更改配置(例如屏幕旋转或内存不足),则该问题。更改配置后,Android将自动使用空构造函数重新创建Fragment。
对于你的情况。 DateChangeListener应该由
主机活动-如果您从活动中打开DatePickerFragment
TargetFragment(通过从Fragment设置setTargetFragment)-如果从Fragment(如父片段)打开DatePickerFragment
在DatePickerFragment中,可以通过如下铸造来访问DateChangeListener:
(DateChangeListener)this.getActivity()---->如果主机活动实现DateChangeListener
(DateChangeListener)this.getTargetFragment()->如果父片段(setTargetFragment)实现DateChangeListener
关于android - 带DatePicker回调的 fragment 中的非默认构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29701947/