Как настроить стиль кнопки "Материал приложения AppCompat"?

Я использую тему AppCompat, и я хочу установить атрибут minHeight на мои кнопки:

<style name="Theme.MyTheme" parent="Theme.AppCompat">
    <item name="android:buttonStyle">@style/MyButtonStyle</item>
</style>

<style name="MyButtonStyle" parent="...?">
    <item name="android:minHeight">60dp</item>
</style>

Однако стиль Widget.AppCompat.Button не установлен в качестве родителя для MyButtonStyle. Если я использую android:Widget.Button, то все мои кнопки выглядят как старый дерьмовый стиль. Я пробовал разные темы для AppCompat, такие как TextAppearance.AppCompat.Button, но они не работают.

Если оставить родительскую тему для стиля кнопки, это также приведет к правильной стилизации кнопки.

Как настроить по умолчанию Theme.AppCompat buttonStyle?

Ответ 1

Вы можете Base.MyButtonStyle расширить android:Widget.Holo.Button на API 14+ (в res/values-v14/styles.xml) и android:Widget.Material.Button на API 21+ (в res/values-v21/styles.xml). Этот стиль изменится в соответствии с версией системы устройства. здесь возможны конкретные модификации платформы.

Затем MyButtonStyle продолжаем Base.MyButtonStyle и определяем android:minHeight здесь (в res/values/styles.xml). Это применимо ко всем платформам.

Затем вы можете использовать стиль MyButtonStyle.

В этом примере предполагается, что ваш минимальный SDK равен 14.

И да, нет стиля кнопки appcompat-v7 (ну, по крайней мере, пока нет).

ИЗМЕНИТЬ

Это предполагает, что с помощью кнопки Holo на платформах старше Lollipop. Он чувствует себя ненавязчивым, и если вы можете обойтись без рябь, это должно быть просто прекрасно. Если вы хотите рябь, я предлагаю вам Google для третьей библиотеки кнопок с леденцом.

Ответ 2

Чтобы ответить на мой собственный вопрос, появляется AppCompat фактически не поддерживает виджет Button в настоящее время:

AppCompat обеспечивает аналогичное поведение в более ранних версиях Android для подмножества виджета пользовательского интерфейса:

  • Все, что предусмотрено панелью инструментов AppCompats (режимы действия и т.д.)
  • EditText
  • Spinner
  • CheckBox
  • RadioButton
  • Switch (используйте новый файл android.support.v7.widget.SwitchCompat)
  • CheckedTextView

Единственным обходным решением, которое я вижу, было бы воссоздание стиля кнопки "Материал" из исходного кода Android, задачи, которая выходит за рамки моего желания.

Ответ 3

Пользовательский стиль кнопки с AppCompat +22 в ваших styles.xml

<style name="Button.Tinted" parent="Widget.AppCompat.Button">
        <item name="colorButtonNormal">YOUR_TINT_COLOR</item>
        <item name="colorControlHighlight">@color/colorAccent</item>
        <item name="android:textColor">@android:color/white</item> </style>

в вашем layout.xml

<Button
        android:id="@+id/but_next"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/but_continue"
        android:theme="@style/Button.Tinted" />

Ответ 4

Удалите android:

<style name="Theme.MyTheme" parent="Theme.AppCompat">
    <item name="buttonStyle">@style/MyButtonStyle</item>
</style>

fooobar.com/questions/108903/...

Ответ 5

С новым MaterialComponent удобно использовать com.google.android.material.button.MaterialButton вместо обычного Button.

Но для стилизации в теме используется другой атрибут  - materialButtonStyle, с этой родительской темой Theme.MaterialComponents.DayNight.NoActionBar.

Тогда тема должна выглядеть так:

<style name="NewAppTheme" 
       parent="Theme.MaterialComponents.DayNight.NoActionBar">
    .......
    <-- IMPORTANT if you are using com.google.android.material.button.MaterialButton to style them use this parameter
    <item name="materialButtonStyle">@style/ButtonStyle</item>
</style>

И в ButtonStyle вы можете изменить атрибуты кнопки следующим образом:

<style name="ButtonStyle" parent="Widget.MaterialComponents.Button.UnelevatedButton">
    <item name="android:minHeight">60dp</item>
</style>