Androidx AppCompatButton выглядит иначе, чем Button, даже на устройстве с высоким уровнем API - PullRequest
1 голос
/ 21 июня 2019

Согласно документации

Кнопка, которая поддерживает совместимые функции в более старых версиях платформа, в том числе:

Разрешает динамический оттенок фона с помощью методов фонового оттенка. в 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" />

Однако вот как это выглядит на самом деле:

enter image description here

Я запустил это на следующем эмуляторе: Galaxy Nexus, API: 28 (720 x 1280 xhdpi)

И когда я применяю buttonStyle в моем приложении, тема выглядит так:

<!-- 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, но не обычную кнопку, как это: (Обратите внимание на небольшую разницу в закругленных краях)

enter image description here

Я также попытался создать пользовательскую кнопку, которая унаследована от android.widget.Button, а также androidx.appcompat.widget.AppCompatButton, обе эти кнопки показывают то же поведение, что и использование AppCompatButton в xml. Так что похоже, что единственным выбросом является кнопка в XML.

Вопрос 1:

По-моему, все это кажется невероятно запутанным. Может кто-нибудь объяснить это как ошибку или функцию?

РЕДАКТИРОВАТЬ 1

Выполняя отладку, я обнаружил, что кнопка фактически превращается в MaterialButton, см. Следующее: enter image description here

Вопрос 2:

Почему происходит это преобразование?

РЕДАКТИРОВАТЬ 2

Ответ на вопрос 2:

Преобразование Button в MaterialButton происходит из-за родительской темы, которую я использовал.

Вопрос 3:

Как реализовать пользовательскую кнопку, которая работает так же, как Button в xml?

В качестве дополнительного примечания и личного мнения, а также небольшого повторения, эта система не только сбивает с толку, но и делает ее правильной и надежной для будущих изменений. В дополнение к этому, документация очень плохая. Буду признателен, если ответ на этот вопрос будет также включен, или, по крайней мере, обсуждение этого вопроса, например, как с этим справиться.

...