1

我有一个名为DatePickerwho extends DialogFragmentand implements的自定义类DatePickerDialog.OnDateSetListener,但我的问题是因为你需要听onDateChangeMethodand DialogFragmentonly have DialogInterface.OnCancelListenerand DialogInterface.OnDismissListener

我怎样才能做到这一点?我试图实现OnDateChangedListener并覆盖该onDateChange方法,但它不起作用。这是代码:

public class DatePicker extends DialogFragment implements
        DatePickerDialog.OnDateSetListener, OnDateChangedListener {

    private OnDateSetListener _onDateSetListener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        _onDateSetListener = (OnDateSetListener) activity;
    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Date initialValue = null;
        String[] buttons = getArguments().getStringArray("buttons");

        Long initialValueLong = getArguments().getLong("initialValue");
        if (initialValue == null) {
            initialValue = new Date();
        }

        Calendar calendar = GregorianCalendar.getInstance();
        calendar.setTimeInMillis(initialValueLong);

        DatePickerDialog dialog = new DatePickerDialog(getActivity(), this,
                calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                calendar.get(Calendar.DATE));


        return dialog;
    }

     @Override
     public void onDateSet(android.widget.DatePicker view, int year,
           int monthOfYear, int dayOfMonth) {
           _onDateSetListener.onDateSet(new GregorianCalendar(year, monthOfYear,
               dayOfMonth).getTime(), getArguments().get("tag"));
     }

    @Override
    public void onDateChanged(android.widget.DatePicker view, int year,
            int monthOfYear, int dayOfMonth) {

        // THIS METHOD NEVER CALLED

    }
}
4

2 回答 2

0

看起来您还没有在您的类中声明 onDateSetListener,并且您还将主机活动转换为错误的类型。Dialog 类本身应该是 OnDateSetListener,并且宿主活动应该被转换为其他东西。

尝试像这样构造类:

public class DatePickerDialogFragment extends DialogFragment implements 
                                             DatePickerDialog.OnDateSetListener
{
    public static interface DatePickedListener
    {
        public void onDatePicked(int selectedYear, int selectedMonth, int selectedDay);
    }

    private DatePickedListener listener;        

    @Override
    public void onAttach(Activity activity)
    {
        // when the fragment is initially attached to the activity, cast the
        // activity to the callback interface type
        super.onAttach(activity);

        try
        {
            listener = (DatePickedListener) activity;
        }
        catch (ClassCastException e)
        {
            throw new ClassCastException(activity.toString() + " must implement " + DatePickedListener.class.getName());
        }
    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        Bundle b = getArguments();

        int year = b.getInt("set_year");
        int month = b.getInt("set_month");
        int day = b.getInt("set_day");

        return new DatePickerDialog(getActivity(), this, year, month, day); 
    }


    @Override
    public void onDateSet(DatePicker view, int setYear, int setMonth, int setDay)
    {
        // when the date is selected, send it to the activity via its callback interface method

        listener.onDatePicked(setYear, setMonth, setDay);
    }           
}  
于 2014-07-14T14:48:59.400 回答
0

我找到了解决方案,只需要获取 de DatePicker 并设置 DatePicker.init 方法

android.widget.DatePicker datePicker = dialog.getDatePicker(); datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE), new OnDateChangedListener() { public void onDateChanged(android.widget.DatePicker view, int year, int month, int day) { _onDateSetListener.dateChange(new GregorianCalendar(year, month, day).getTime(), getArguments() .get("tag")); } });

于 2014-07-16T13:35:03.563 回答