存在关于如何通过创建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策略,还是应该更改实现此功能的方式?

另请注意,我正在强制应用程序在orientationlandscape中将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/

10-11 21:41