Невозможно стилизовать пользовательскую кнопку - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь стилизовать пользовательскую кнопку - но большинство стилей, которые я объявил в styles.xml, не применяются.

<!-- styles.xml -->
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
  <item name="selectableFlatButton">@style/SelectableFlatButton</item>
</style>

<style name="SelectableFlatButton" parent="FlatButton">
    <item name="backgroundTint">@color/bg_selectable_button_color</item>
    <item name="android:textColor">@color/selectable_button_text_color</item>
    <item name="iconTint">@color/selectable_button_text_color</item>
</style>

<style name="FlatButton" parent="Widget.MaterialComponents.Button.UnelevatedButton">
    <item name="android:elevation">0dp</item>
    <item name="cornerRadius">0dp</item>
    <item name="backgroundTint">@color/gray98</item>
    <item name="rippleColor">@color/colorPrimaryLight</item>
    <item name="android:textColor">@color/colorPrimary</item>
    <item name="android:selectable">true</item>
    <item name="android:insetTop">0dp</item>
    <item name="android:insetBottom">0dp</item>
    <item name="android:textAllCaps">false</item>
    <item name="iconGravity">textStart</item>
    <item name="iconTint">@color/colorPrimary</item>
</style>

<!-- attrs.xml -->
<resources>
    <attr name="selectableFlatButton" format="reference" />
</resources>

Реализация Button.Все, что он делает, это устанавливает стиль по умолчанию.

import android.content.Context
import android.util.AttributeSet
import android.widget.Button
import com.guyca.R


class SelectableFlatButton(context: Context, attrs: AttributeSet? = null) : Button(context, attrs, R.attr.selectableFlatButton)

Использование в файле макета:

<com.guyca.SelectableFlatButton
    android:id="@+id/selectButton"
    android:layout_width="0dp"
    android:layout_height="56dp"
    android:text="@string/select"
    app2:icon="@drawable/ic_delete_sweep_24dp" />

Если вместо этого, используя мой SelectableFlatButton, я использую androids 'Button и передаюстиль как style="@style/SelectableFlatButton" - выглядит так, как ожидалось.

Кажется, что единственные свойства стиля, которые работают, это android:textAllCaps и android:textColor - остальные не влияют на мою кнопку.

1 Ответ

0 голосов
/ 21 сентября 2019

Поскольку вы используете MaterialTheme, вы можете расширить MaterialButton:

class SelectableFlatButton(context: Context, attrs: AttributeSet? = null) :
    MaterialButton(context, attrs, R.attr.selectableFlatButton)

Затем определить стиль атрибута по умолчанию:

<style name="AppTheme" parent="Theme.MaterialComponents.*">
  <item name="selectableFlatButton">@style/SelectableFlatButton</item>
  ...
</style>

и:

  <!-- Custom -->
  <style name="FlatButton" parent="Widget.MaterialComponents.Button.UnelevatedButton">
    <item name="elevation">0dp</item>
    <item name="cornerRadius">0dp</item>
    <item name="backgroundTint">@color/...</item>
    <item name="rippleColor">@color/....</item>
    <item name="android:textColor">@color/....</item>
    <item name="android:insetTop">...</item>
    <item name="android:insetBottom">...</item>
    <item name="android:textAppearance">@style/MyTextAppearance.MaterialComponents</item>
    <item name="android:selectable">true</item>
    <item name="iconGravity">textStart</item>
    <item name="iconTint">@color/....</item>
  </style>

  <style name="MyTextAppearance.MaterialComponents" parent="TextAppearance.MaterialComponents.Button">
    <item name="android:textAllCaps">false</item>
  </style>

  <style name="SelectableFlatButton" parent="FlatButton">
    <item name="backgroundTint">@color/...</item>
    <item name="android:textColor">@color/...</item>
    <item name="iconTint">@color/....</item>
  </style>

Использование в макете:

   <com.google.android.material.button.MaterialButton
        app:icon="@drawable/...."
        style="@style/SelectableFlatButton"
        ../>


   <com.xxxx.SelectableFlatButton
        app:icon="@drawable/..."
        .../>

у вас тот же результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...