У меня есть два MaterialButton
в LinearLayout
, и я меняю их цвет фона и цвет текста в зависимости от некоторого внутреннего состояния, на которое я переключаюсь, когда щелкаю любой из них. Он отлично работает во всех версиях Android выше Lollipop. Исходное состояние для них во всех версиях Android работает корректно, проблема при переключении цветов в леденце.
Вот фото начального состояния.
Фото правильного цвета во всех версиях Android выше Lollipop.
Фотография того, что сейчас происходит в Android Lollipop.
Я не знаю, какой это случай. Я пробовал много разных вещей, но ни одна из них не работала.
Вот XML-код файла макета
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:orientation = "horizontal">
<android.support.design.button.MaterialButton
android:id = "@+id/handymanServicesButton"
style = "@style/View.RoundedMaterialButton"
android:layout_width = "0dp"
android:layout_height = "wrap_content"
android:layout_margin = "@dimen/margin_medium"
android:layout_weight = "1"
android:elevation = "16dp"
android:onClick = "@{view::handymanServices}"
android:text = "@{viewModel.isHandymanUser() ? @string/handyman_services_button_label : @string/main_button_label}"
android:textAllCaps = "false"
android:textSize = "@dimen/text_size_small"
tools:text = "@string/handyman_services_button_label" />
<android.support.design.button.MaterialButton
android:id = "@+id/otherButton"
style = "@style/RoundedMaterialButtonNotSelected"
android:layout_width = "0dp"
android:layout_height = "wrap_content"
android:layout_margin = "@dimen/margin_medium"
android:layout_weight = "1"
android:elevation = "16dp"
android:onClick = "@{view::other}"
android:text = "@string/other_button_label"
android:textAllCaps = "false"
android:textSize = "@dimen/text_size_small" />
</LinearLayout>
Стили, которые я применил к кнопке.
<style name = "View.RoundedMaterialButton">
<item name = "android:minHeight">@dimen/buttonHeight</item>
<item name = "android:elevation">@dimen/cardElevation</item>
<item name = "android:gravity">center</item>
<item name = "rippleColor">@color/material_ripple_color</item>
<item name = "cornerRadius">24dp</item>
<item name = "android:textSize">14sp</item>
<item name = "android:textStyle">bold</item>
<item name = "backgroundTint">@color/colorAccent</item>
<item name = "android:textAllCaps">true</item>
<item name = "android:textColor">@android:color/white</item>
<item name = "android:textAppearance">@style/TextAppearance.MaterialComponents.Button</item>
</style>
<style name = "RoundedMaterialButtonNotSelected" parent = "View.RoundedMaterialButton">
<item name = "backgroundTint">@android:color/white</item>
<item name = "android:textColor">@color/colorAccent</item>
</style>
Код во фрагменте, меняющий цвета.
private fun handymanServicesUi() {
binding.handymanServicesButton.backgroundTintList =
ContextCompat.getColorStateList(requireContext(), R.color.colorAccent)
binding.otherButton.backgroundTintList =
ContextCompat.getColorStateList(requireContext(), android.R.color.white)
binding.handymanServicesButton.setTextColor(Color.WHITE)
binding.otherButton.setTextColor(
ContextCompat.getColor(requireContext(), R.color.colorAccent))
}
fun handymanServices(@Suppress("UNUSED_PARAMETER") view: View) {
handymanServicesUi()
viewModel.switchToHandymanServices()
}
private fun otherUi() {
binding.handymanServicesButton.backgroundTintList =
ContextCompat.getColorStateList(requireContext(), android.R.color.white)
binding.otherButton.backgroundTintList =
ContextCompat.getColorStateList(requireContext(), R.color.colorAccent)
binding.handymanServicesButton.setTextColor(
ContextCompat.getColor(requireContext(), R.color.colorAccent))
binding.otherButton.setTextColor(Color.WHITE)
}
fun other(@Suppress("UNUSED_PARAMETER") view: View) {
otherUi()
viewModel.switchToOthers()
}
Первый используется с библиотеками androidX. Что не так здесь.
Я предлагаю вам использовать новую библиотеку вместо старой, что, я думаю, может иметь место здесь.
Я попробовал новый в приложении для игровой площадки. У него тоже такая же проблема.
установка backGroundTintList
как selector
из xml может решить проблему.
Создайте селекторы состояния цвета для текста и фона. Для цвета текста вы можете сделать следующее:
<!-- under res/colors/handyman_text_color_selector.xml-->
<selector xmlns:android = "http://schemas.android.com/apk/res/android">
<item android:color = "@color/colorAccent" android:state_selected = "true" />
<item android:color = "@android:color/white" />
</selector>
Сделайте то же самое для backgroundTint, скажем handyman_button_color_selector.xml
Затем примените их к макету и используйте эти селекторы цветов. (Желательно добавить их в стиль)
<android.support.design.button.MaterialButton
android:id = "@+id/handymanServicesButton"
style = "@style/View.RoundedMaterialButton"
android:textColor = "@color/handyman_text_color_selector"
app:backgroundTint = "@color/handyman_button_color_selector" />
Наконец, в Kotlin просто переключите две кнопки:
binding.handymanServicesButton.isSelected = !isSelected
binding.otherButton.isSelected = isSelected
Пожалуйста, просмотрите также этот проблема, у него похожая проблема.
Это лучшее решение. Вы также можете просто использовать myButton.isSelected = true для переключения состояния
android:state_checked вместо android:state_selected работал у меня
Сработало отлично спасибо!
Попробуйте
com.google.android.material.button.MaterialButton
вместоandroid.support.design.button.MaterialButton