【问题标题】:DialogFragment DatePickerDialog does not return changed dateDialogFragment DatePickerDialog 不返回更改的日期
【发布时间】:2026-01-17 03:35:02
【问题描述】:

我在片段中有 datepicker dialogframgent,当我在 onDateSet() 方法中记录日期时,我只从 datepicker spinner 获取原始日期而不是更改日期。我一直在关注http://developer.android.com/guide/topics/ui/controls/pickers.html 的示例,因为我是 android 新手。知道我做错了什么吗?

对话框片段

public static class DobFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{

        final Calendar calendar = Calendar.getInstance();
        DatePicker picker;

        protected DialogInterface.OnClickListener btn_ok_listener = new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
                picker.clearFocus();
                onDateSet(picker, picker.getYear(), picker.getMonth(), picker.getDayOfMonth());
            }
        };

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            LayoutInflater inflater = getActivity().getLayoutInflater();
            View spinner = inflater.inflate(R.layout.date_spinner, null);

            int year = calendar.get(Calendar.YEAR);
            int month = calendar.get(Calendar.MONTH);
            int day = calendar.get(Calendar.DAY_OF_MONTH);

            DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), this, year, month, day);
            picker = datePickerDialog.getDatePicker();

            datePickerDialog.setCancelable(true);
            datePickerDialog.setCanceledOnTouchOutside(true);
            datePickerDialog.setView(spinner);
            datePickerDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Ok", btn_ok_listener);
            datePickerDialog.onDateChanged(picker,picker.getYear(),picker.getMonth(),picker.getDayOfMonth());


            datePickerDialog.setTitle("Birthday");

            return datePickerDialog;
        }

        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

            Log.v("dates",String.valueOf(picker.getYear()) +"-" + String.valueOf(year) +"-" + String.valueOf(calendar.getTime()));
//            Intent intent = new Intent();
//            intent.putExtra("result",formattedDate);
//            getTargetFragment().onActivityResult(getTargetRequestCode(), 1, intent);
        }
    }

显示对话框方法

public void showDobDialog() {
    FragmentManager fragManager = myContext.getFragmentManager();
    DialogFragment frag = new DobFragment();
    frag.setTargetFragment(this,1);
    frag.show(fragManager, "dob");
}

日期微调器布局

<?xml version="1.0" encoding="utf-8"?>
<DatePicker
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:datePickerMode="spinner"
    android:calendarViewShown="false">
</DatePicker>

从 OnDateSet 记录

2015-2015-Fri Aug 07 19:35:55 PDT 2015

我的 DatePicker 测试运行 - 原始日期 2015 年 8 月 7 日

【问题讨论】:

  • 当我不设置自己的视图时,它可以正常工作,但我想要一个微调器而不是日历。

标签: android datepicker android-dialogfragment


【解决方案1】:

试试这个

@Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {

    final AtomicBoolean buttonPressed = new AtomicBoolean();
    final DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), null, yearOfBirth, monthOfYear, dayOfMonth) {
        @Override protected void onStop() {
            super.onStop();
            if (!buttonPressed.get()) {
                callback.dialogDismissed(DobFragment.this, false);
            }
        }
    };

    datePickerDialog.setTitle(dialogTitle);
    OnClickListener listener = new OnClickListener() {
        @Override public void onClick(DialogInterface dialog, int which) {
            buttonPressed.set(true);
            boolean okSelected = which == BUTTON_POSITIVE;
            callback.dialogDismissed(DobFragment.this, okSelected);
            if (okSelected) {
                DatePicker datePicker = datePickerDialog.getDatePicker();
                //DatePicker does not take the value in the picker as final value entered by the user, instead it take the index of the current value
                //The below line clear the focus on the date picker making it update all its indexes and delivering the right values when clicking Set
                //button.
                datePicker.clearFocus();
                callback.onDateSet(datePicker, datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth());
            }
        }
    };
    datePickerDialog.setButton(BUTTON_NEGATIVE, "Cancel", listener);
    datePickerDialog.setButton(BUTTON_POSITIVE, "Set", listener);
    return datePickerDialog;
}

【讨论】:

  • 你知道为什么我没有设置 datePickerDialog.setview(spinner) 时得到正确的更改日期吗?但当我使用自定义视图时不会?
  • 您能否提供有关您的自定义视图的更多详细信息。
  • 它只是上面的 date_spinner.xml 文件。我给它充气,然后用 datePickerDialog.setView(spinner) 将它设置为视图。我这样做是因为如果我不这样做,我就会被日历日期选择器困住,为了方便起见,我希望它作为一个微调器,并且 picker.setCalendarViewShown(false);选择器.setSpinnersShown(true);没有效果。
  • 你能详细说明为什么你需要微调器以及什么类型。由于我分享的代码还为您提供了一个日期对话框,您可以在其中上下滚动以更改日期。
最近更新 更多