【问题标题】:Hide month and year selection in datepicker dialog在日期选择器对话框中隐藏月份和年份选择
【发布时间】:2020-08-16 06:19:41
【问题描述】:

您好,我在日期选择器对话框中传递月份和年份以显示该月的日期是否有任何可能的方法从日期选择器对话框中隐藏年份和月份This is how it looks

这是我需要展示的:

【问题讨论】:

标签: android android-studio android-layout android-datepicker


【解决方案1】:

您想使用CalendarView 小部件。请注意,将显示年份和月份,但不会以大字体显示。你可以把它放在一个带有几个按钮的 DialogFragment 中来达到你想要的结果:

public class CalendarViewDialog extends DialogFragment {

    private static final String KEY_DATE = "date";

    private long date = System.currentTimeMillis();

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        Context context = requireContext();

        Bundle args = getArguments();
        if (args != null && args.containsKey(KEY_DATE)) {
            date = args.getLong(KEY_DATE);
        }

        CalendarView calendarView = new CalendarView(context);
        calendarView.setDate(date);
        calendarView.setOnDateChangeListener((view, year, month, dayOfMonth) ->
                date = new GregorianCalendar(year, month, dayOfMonth).getTimeInMillis());

        return new AlertDialog.Builder(context)
                .setView(calendarView)
                .setPositiveButton(android.R.string.ok, (dialog, which) -> {
                    if (getParentFragment() instanceof Callback) {
                        ((Callback) requireParentFragment()).onDateSelected(date);
                    }
                })
                .setNegativeButton(android.R.string.cancel, null)
                .create();
    }

    public static CalendarViewDialog newInstance(long date) {
        CalendarViewDialog dialog = new CalendarViewDialog();
        Bundle args = new Bundle();
        args.putLong(KEY_DATE, date);
        dialog.setArguments(args);
        return dialog;
    }

    public interface Callback {
        void onDateSelected(long date);
    }
}

在另一个片段中像这样使用它:

public class MyFragment extends Fragment implements CalendarViewDialog.Callback {

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        btn.setOnClickListener(v -> {
            CalendarViewDialog.newInstance(System.currentTimeMillis())
                    .show(getChildFragmentManager(), "date-dialog");
        });
    }

    @Override
    public void onDateSelected(long date) {
        // Do whatever you want with `date`.
    }
}

【讨论】:

  • 是的,请@Nicolas
  • Java 还是 Kotlin?
  • 我需要 JAVA 提前致谢
  • 查看我的编辑。请注意,年和月 可见,但不像 DatePickerDialog 那样以大字体显示。
【解决方案2】:

您可以使用材料组件库提供的MaterialDatePicker

您可以使用CalendarConstraints 将选择限制为单个月份,而不是隐藏月/年选择器。

    long today = MaterialDatePicker.todayInUtcMilliseconds();
    Calendar utc = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    utc.clear();
    utc.setTimeInMillis(today);
    utc.set(Calendar.DAY_OF_MONTH, 1);
    long thisMonthFirst = utc.getTimeInMillis();
    utc.set(Calendar.DATE, utc.getActualMaximum(Calendar.DATE));
    long thisMonthLast = utc.getTimeInMillis();

    MaterialDatePicker.Builder<Long> builder = MaterialDatePicker.Builder.datePicker();
    builder.setSelection(today);

    CalendarConstraints.Builder constraintsBuilder = new CalendarConstraints.Builder();
    constraintsBuilder.setOpenAt(today);
    constraintsBuilder.setStart(thisMonthFirst);
    constraintsBuilder.setEnd(thisMonthLast);

    builder.setCalendarConstraints(constraintsBuilder.build());
    MaterialDatePicker<Long> picker = builder.build();
    picker.show(getSupportFragmentManager(), picker.toString());

通过这种方式,选择仅限于当前月份,用户无法选择其他年份/月份。
您可以更改您的逻辑 (utc.setTimeInMillis(today)) 以再使用一个月。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    相关资源
    最近更新 更多