DatePickerDialog 已将 androidx.fragment.app.DialogFragment 中的按钮涂黑

DatePickerDialog has blacked out buttons in androidx.fragment.app.DialogFragment

这个简单class:

class DateSelectionDialogFragment : DialogFragment() {

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val calendar = Calendar.getInstance()
        val year = calendar.get(Calendar.YEAR)
        val month = calendar.get(Calendar.MONTH)
        val dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH)
        return DatePickerDialog(requireContext(), this, year, month, dayOfMonth)
    }
}

导致按钮行为异常。重要的是我没有为对话框指定任何样式。 DialogFragment 来自 androidx.fragment.app 包。

问题来自Theme.MaterialComponents.Light.NoActionBar

它很新(而且是 alpha 版),应该会取代 Theme.Design.Light.NoActionBar,但正如我们所见,它还不够好。

您的解决方案是只使用 Theme.Design.Light.NoActionBar.

但是如果你真的想使用Theme.MaterialComponents.Light.NoActionBar... 问题是主题中的这个设置引起的:

<item name="viewInflaterClass">com.google.android.material.theme.MaterialComponentsViewInflater</item>

您可以用另一个 *ViewInflater 替换它,但没有太多选择:

<item name="viewInflaterClass">androidx.appcompat.app.AppCompatViewInflater</item>

它有效,但我不会太依赖它,因为使用另一个包中的 Inflater 可能会导致奇怪的问题。

Dialog 将从 colors.xml 文件带你 colorAccent 属性,所以检查那个值,或者你可以通过在 style.xml 文件

中创建自定义样式来指定或修改对话框样式

如果您没有更改任何样式,我最好的猜测是它与 Kotlin 在这一行中派生上下文的方式有关:

return DatePickerDialog(requireContext(), this, year, month, dayOfMonth)

对于 Java,您可以这样调用 DatePickerDialog:

return new DatePickerDialog(getActivity(), this, year, month, day); android docs reference

我不是 Kotlin 专家,但是我使用 here 的 Java 到 Kotlin 转换器返回 Kotlin 如下行:

return DatePickerDialog(getActivity(), this, year, month, day)

正常的 DatePickerDialog 不显示具有默认按钮背景颜色的 'ok' 和 'cancel' 按钮。它显示白色背景并将按钮文本设置为该默认颜色。

我认为您的代码以某种方式从父级 activity 或应用程序的默认值派生按钮样式的上下文,这将使按钮的背景颜色与主样式而不是日期选择器的样式相匹配正常覆盖为白色背景。

我最好的猜测是因为您正在使用新的 requireContext()requireActivity() 方法 here;但是,为什么要使用上下文而不是 activity?请尝试 requireActivity()

return DatePickerDialog(requireActivity(), this, year, month, dayOfMonth)

试过这行and/or getActivity()如上所示,请更新。

几周来我一直在努力解决这个问题;几天前我偶然发现了一个解决方案,但我忘记了在哪里。这就是你要做的;在您的 styles.xml 文件中添加一个新样式:

<style name="DatePickerStyle" parent="Theme.MaterialComponents.Light.Dialog">
    <item name="colorAccent">@color/colorSecondary</item>
    <item name="materialButtonStyle">@style/Widget.MaterialComponents.Button.TextButton</item>
</style>

其中 @color/colorSecondary 是您在 AppTheme 中使用的辅助颜色。现在在您的 AppTheme 中添加以下项目:

<style name="AppTheme" parent="Theme.MaterialComponents.NoActionBar">
   ...
   ...
   <item name="android:datePickerDialogTheme">@style/DatePickerStyle</item>
</style>

终于帮我解决了。我希望这有帮助!我最好的猜测是这是新 Theme.MaterialComponents.NoActionBar.

中的错误

正如 Moi Janki 所建议的。我的解决方案涉及必须包含 colorPrimary 以便按钮中的文本与主题匹配。见下文; colorAccent 更改突出显示和日期选择器颜色:

我的 DatePicker 样式如下:

<!-- Date Picker Style -->
<style name="MyDatePicker" parent="Theme.MaterialComponents.Light.Dialog">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="materialButtonStyle">@style/Widget.MaterialComponents.Button.TextButton.Dialog</item>

</style>