DatePickerDialog имеет затемненные кнопки в androidx.fragment.app.DialogFragment

80
6

Этот простой класс:

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

спросил(а) 2020-04-04T00:43:34+03:00 5 месяцев, 4 недели назад
1
Решение
80

Проблема связана с Theme.MaterialComponents.Light.NoActionBar.

Это довольно новый (и альфа), и он должен заменить 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 из другого пакета может вызвать странные проблемы.

ответил(а) 2020-04-04T00:55:03.112411+03:00 5 месяцев, 4 недели назад
57

Если вы не изменили никаких стилей, я думаю, что это имеет какое-то отношение к тому, как Котлин выводит контекст в этой строке:

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

Для Java вы бы назвали DatePickerDialog следующим:

return new DatePickerDialog(getActivity(), this, year, month, day); Ссылка на android docs

Я не эксперт в Kotlin, но конвертер Java в Kotlin, который я использовал здесь, вернул Kotlin в эту строку:

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


Обычный DatePickerDialog не отображает кнопки "ok" и "cancel" с цветом фона кнопки кнопки по умолчанию. Он отображает белый фон и устанавливает текст кнопки для этого цвета по умолчанию.

Я думаю, что ваш код каким-то образом выводит контекст ваших стилей кнопок из родительской активности или по умолчанию вашего приложения, что соответствует цвету фона кнопок основного стиля, а не заменяет дату на обычном фоне.

Мое предположение, потому что вы используете новый requireContext() и requireActivity() методы здесь; однако почему вы используете контекст вместо активности? requireActivity() этого попробуйте requireActivity():

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

После getActivity() этой строки и/или getActivity() как показано выше, обновите.

ответил(а) 2020-04-04T00:43:34+03:00 5 месяцев, 4 недели назад
40

Диалог примет свойство colorAccent из файла colors.xml, поэтому проверьте это значение или вы можете указать или изменить стиль диалога, создав свой собственный стиль в файле style.xml

ответил(а) 2020-04-04T00:43:34+03:00 5 месяцев, 4 недели назад
41

Я пытался понять это уже несколько недель; Я просто наткнулся на решение несколько дней назад, но я забыл, где. Вот что ты делаешь; в вашем 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.

ответил(а) 2020-04-04T00:43:34+03:00 5 месяцев, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема