4

这个简单的类:

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)
    }
}

导致奇怪的行为按钮。重要的是我没有为对话框指定任何样式。来自包装DialogFragmentandroidx.fragment.app

对话

4

5 回答 5

4

几个星期以来,我一直在努力解决这个问题。几天前我偶然发现了一个解决方案,但我忘记了在哪里。这就是你要做的;在您的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.

于 2018-12-18T03:32:09.317 回答
4

问题来自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 可能会导致奇怪的问题。

于 2018-05-29T14:37:06.617 回答
1

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

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

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

return new DatePickerDialog(getActivity(), this, year, month, day); 安卓文档参考

我不是 Kotlin 专家,但我在这里使用的 Java 到 Kotlin 转换器将 Kotlin 作为以下行返回:

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

正常的 DatePickerDialog 不显示具有默认按钮背景颜色的“确定”和“取消”按钮。它显示白色背景并将按钮文本设置为该默认颜色。

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

我最好的猜测是因为你在这里requireContext()使用了新的和requireActivity()方法;但是,您为什么使用上下文而不是活动?请尝试:requireActivity()

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

尝试此行和/或getActivity()如上所示后,请更新。

于 2018-06-01T06:13:56.790 回答
0

对话框将从文件中获取colorAccent属性colors.xml,因此请检查其值,或者您可以通过在 style.xml 文件中创建自定义样式来指定或修改对话框样式

于 2018-06-01T05:10:11.763 回答
0

正如 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>
于 2019-03-05T12:26:45.513 回答