这个简单的类:
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可能会导致奇怪的问题。
我一直试图想出这个问题好几个星期了;我几天前偶然发现了一个解决方案,但我忘了在哪里。这是你做的;在你的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
中的一个错误。
如果你没有改变任何样式,我最好的猜测是它与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不显示带有默认按钮背景颜色的“ok”和“cancel”按钮。它显示白色背景并将按钮文本设置为默认颜色。
我认为您的代码以某种方式从父活动或应用程序的默认值中获取按钮样式的上下文,这将使按钮的背景颜色与主样式相匹配,而不是将日期选择器的正常覆盖与白色背景相匹配。
我最好的猜测是因为你正在使用新的requireContext()
和requireActivity()
方法here;但是,为什么使用上下文而不是活动?请尝试使用requireActivity()
:
return DatePickerDialog(requireActivity(), this, year, month, dayOfMonth)
如上所示尝试此行和/或getActivity()
后,请更新。
Dialog将从colors.xml
文件中获取colorAccent属性,因此检查该值,或者您可以通过在style.xml文件中创建自定义样式来指定或修改对话框样式
正如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>