安卓材料设计内联日期选择器问题

41

我有一个带有日期选择器的ScrollView

在之前版本的Android中,日期选择器是这样的:

图片描述

我可以滚动日期选择器中单个元素(天、月、年),没有问题。

在Android Lollipop API 21 Material中,日期选择器显示如下:

图片描述图片描述

如果我点击月份,将显示一个日历视图,但我无法更改月份,只能选择日期。如果我尝试编辑年份,则会显示一个年份滚动条,但如果我尝试滚动它,则整个包含日期选择器的布局都会被滚动,而不仅仅是日期。

calendarViewShown=false

似乎被忽略了

我该如何解决这个问题???

2个回答

65

calendarViewShown 属性在日历样式日期选择器中已弃用。如果您想要恢复旋转器样式的日期选择器,可以将 datePickerMode 属性设置为 spinner

<DatePicker
    ...
    android:datePickerMode="spinner" />

关于滚动问题,日历式日期选择器不支持嵌套滚动。


2
谢谢!你救了我! - AndreaF
7
谷歌,真是太感谢你了!拿着已经能够正常运行的代码,在新版Android系统上却将其彻底搞砸了。这甚至不仅仅是源代码兼容性的问题,而是他们破坏了二进制兼容性。 - Adam Rosenfield
3
如果您正在使用 Holo,那么默认情况下仍将获得圆形进度条的日期选择器,并且 API 的预期功能仍将可用。如果您将应用程序更新为 Material,则需要更改许多内容以支持新的样式,其中之一就是该日期选择器。 - alanv
2
使用android:datePickerMode="spinner"会得到一个非常丑陋的警告:attribute "datePickerMode" is only used in API level 21 and higher (current min is 16) - Mulgard
11
@Mulgard 没问题,只需添加 tools:ignore="UnusedAttribute" 来消除警告。在 Android 5.0(Lollipop)之前的 API 级别中将忽略 android:datePickerMode 属性。 - akhy
显示剩余5条评论

2

步骤一:创建下拉菜单/日历日期选择器布局

.../main/res/layout/spinner_date_picker_layout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <DatePicker xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/datePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:datePickerMode="spinner"
        android:calendarViewShown="false" />

.../main/res/layout/calendar_date_picker_layout.xml

可以找到日历日期选择器的布局文件。
    <?xml version="1.0" encoding="utf-8"?>
    <DatePicker xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/datePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:datePickerMode="calendar" />

步骤二:设置TextView的可点击行为以显示日期对话框。

.../main/res/layout/activity_layout.xml

    <TextView
        android:id="@+id/dateText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:clickable="true"
        android:text="Date"
        android:onClick="@{() -> viewModel.onClickDate()}"></TextView>

步骤三:在onClickDate上显示对话框

override fun onClickDate() {
        showDialogForDate()
}

步骤四:将日期选择器布局设置为对话框视图。
private fun showDialogForDate() {

    //Set spinner/calendar date picker layout
    val spinnerDatePicker = layoutInflater.inflate(R.layout.spinner_date_picker_layout, null)

    // On click listener for dialog buttons
    val dialogClickListener = DialogInterface.OnClickListener { _, which ->
        when (which) {
            DialogInterface.BUTTON_POSITIVE -> {
                activity!!.dateText.text = spinnerDatePicker.datePicker.dayOfMonth.toString() + "/" + (spinnerDatePicker.datePicker.month + 1) + "/" + spinnerDatePicker.datePicker.year
            }
            DialogInterface.BUTTON_NEGATIVE -> {

            }
        }
    }

    val builder = AlertDialog.Builder(context!!)
    builder.setTitle(resources.getString(R.string.dialog_title))
        .setView(spinnerDatePicker)
        .setPositiveButton("Ok", dialogClickListener)
        .setNegativeButton("Cancel", dialogClickListener)
        .create()
        .show()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接