DatePickerDialog使androidx.fragment.app.DialogFragment中的按钮变黑

时间:2018-05-25 13:23:34

标签: android android-fragments kotlin android-alertdialog android-jetpack

这个简单的课程:

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包。

Dialog

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

如果你没有改变任何风格,我最好的猜测是它与Kotlin在这一行中推导出背景的方式有关:

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

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

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

我没有关于Kotlin的专家,但是我用here的Java to Kotlin转换器将Kotlin作为这一行返回:

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

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

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

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

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

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

答案 2 :(得分:1)

我已经尝试了好几个星期了。几天前,我偶然发现了一个解决方案,但我忘了在哪里。这就是你要做的事;在您的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中的错误。

答案 3 :(得分:0)

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

答案 4 :(得分: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>