Согласно документации
Кнопка, которая поддерживает совместимые функции на более старых версиях платформы, в том числе:
Разрешает динамический оттенок своего фона с помощью методов оттенка фона в ViewCompat. Позволяет установить оттенок фона с помощью R.attr.backgroundTint и R.attr.backgroundTintMode. Это будет автоматически использоваться, когда вы используете кнопку в своих макетах, а действие/диалог верхнего уровня предоставляется appcompat. Вам нужно только вручную использовать этот класс при написании пользовательских представлений.
Теперь это заставляет меня предположить, что следующие две кнопки будут выглядеть точно так же на устройствах высокого уровня.
<androidx.appcompat.widget.AppCompatButton
android:text="AppCompatButton"
android:id="@+id/appcompatbutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:layout_below="@id/appcompatbutton"
android:id="@+id/button"
android:layout_width="wrap_content"
android:text="Button"
android:layout_height="wrap_content" />
Однако вот как это выглядит на самом деле:
Я запустил это на следующем эмуляторе: Galaxy Nexus, API: 28 (720 x 1280 xhdpi)
И когда я применяю buttonStyle в своем appTheme следующим образом:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="buttonStyle">@style/Widget.MaterialComponents.Button</item>
</style>
Он изменяет AppCompatButton, но не обычную кнопку, например: (Обратите внимание на небольшую разницу в закругленных краях)
Я также попытался создать пользовательскую кнопку, которая унаследована от android.widget.Button, а также от androidx.appcompat.widget.AppCompatButton, обе эти кнопки показывают то же поведение, что и использование AppCompatButton в xml. Так что кажется, что единственным исключением является Button в XML.
Вопрос 1:
Как по мне, все это кажется невероятно запутанным. Может ли кто-нибудь объяснить это как ошибку или функцию?
ИЗМЕНИТЬ 1
Выполняя отладку, я обнаружил, что Button фактически преобразуется в MaterialButton, см. следующее:
Вопрос 2:
Почему происходит эта трансформация?
ИЗМЕНИТЬ 2
Ответ на вопрос 2:
Преобразование Button в MaterialButton связано с родительской темой, которую я использовал.
Вопрос 3:
Как вы реализуете пользовательскую кнопку, которая работает так же, как кнопка в xml?
В качестве примечания и личного мнения, а также небольшого повторения, эта система не только сбивает с толку, но ее трудно понять правильно и надежно для будущих изменений. В дополнение к этому, документация очень плохая. Я был бы признателен, если бы также был включен ответ на этот вопрос или, по крайней мере, обсуждение этого вопроса, например, как с этим бороться.