微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在日期选择器对话框中隐藏月份和年份选择

如何解决在日期选择器对话框中隐藏月份和年份选择

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

这是我需要显示内容

This is what i need to show

解决方法

您要使用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,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`.
    }
}
,

您可以使用材料成分库提供的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))以使用另一个月。

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?