Глобальный стиль для нового com.google.android.material.textfield.TextInputEditText

Можно ли стилизовать новый компонент com.google.android.material.textfield.TextInputEditText, не устанавливая его дополнительно для каждого компонента?

Например:

Для нового TextInputLayout я могу установить стиль глобально следующим образом:

<style name="Theme.MyTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
                                .
                                .
                                .
    <item name="textInputStyle">@style/MyTextInputLayoutStyle</item>
</style>

Я ожидаю для TextInputEditText аналогичный способ, например:

<item name="editTextStyle">@style/MyTextInputEditTextStyle</item>

но это не работает.

Здесь аналогичный post, но только для старых компонентов поддержки дизайна.




Ответы (2)


Согласно этому комментарию, editTextStyle является правильным атрибутом для установки. https://github.com/material-components/material-components-android/blob/6c70169e8d4ae77429a9c57785e443b2a18b4aa3/lib/java/com/google/android/material/theme/res/values/attrs.xml#L85

См. примеры использования в этих стилях: https://github.com/material-components/material-components-android/blob/6c70169e8d4ae77429a9c57785e443b2a18b4aa3/lib/java/com/google/android/material/textfield/res/values/styles.xml#L141

Обновлено: установите @style/ThemeOverlay.MaterialComponents.TextInputEditText внутри вашего пользовательского TextInputLayoutStyle.

person wcshi    schedule 04.01.2019
comment
Не могли бы вы попробовать установить materialThemeOverlay внутри MyTextInputLayoutStyle? - person wcshi; 04.01.2019
comment
Настройка <item name="materialThemeOverlay">@style/ThemeOverlay.MaterialComponents.TextInputEditText</item> внутри моего пользовательского TextInputLayoutStyle сработала для меня. Спасибо! Обновите свой ответ, тогда я одобрю его. - person Valentin Gavran; 10.01.2019

TextInputLayout переопределяет атрибут editTextStyle, используя атрибут materialThemeOverlay.

Например, Widget.MaterialComponents.TextInputLayout.FilledBox имеет такой стиль по умолчанию:

<style name="Widget.MaterialComponents.TextInputLayout.FilledBox" parent="Base.Widget.MaterialComponents.TextInputLayout">
    <item name="materialThemeOverlay">
       @style/ThemeOverlay.MaterialComponents.TextInputEditText.FilledBox
    </item>
    ....
</style>
<style name="ThemeOverlay.MaterialComponents.TextInputEditText.FilledBox">
    <item name="editTextStyle">@style/Widget.MaterialComponents.TextInputEditText.FilledBox</item>
</style>

Чтобы определить глобально, вы должны определить стиль для TextInputLayout, расширяющего один из материальные темы.
Затем вам нужно использовать новый атрибут materialThemeOverlay. Это позволяет вам переопределять атрибуты темы приложения, и вы можете изменить атрибут editTextStyle.

Что-то типа:

  <style name="MyCustomOutlined" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox">
    <item name="materialThemeOverlay">@style/MyThemeOverlayOutlined</item>    
  </style>

Таким образом, вы можете изменить editTextStyle (атрибут темы приложения) только для этого стиля компонента.

  <style name="MyThemeOverlayOutlined">
    <item name="editTextStyle">@style/MyTextInputEditText_outlinedBox</item>
  </style>

  <style name="MyTextInputEditText_outlinedBox" parent="@style/Widget.MaterialComponents.TextInputEditText.OutlinedBox">
    <item name="android:paddingTop">8dp</item>
    <item name="android:paddingBottom">8dp</item>
    ....
  </style>

Наконец, вы можете назначить MyCustomOutlined конкретному TextInputLayout в макете:

    <com.google.android.material.textfield.TextInputLayout
        style="@style/MyCustomOutlined"
        .../>

или назначьте глобально в теме вашего приложения, используя:

<style name="AppTheme" parent="Theme.MaterialComponents.Light">
   ....
   <item name="textInputStyle">@style/MyCustomOutlined</item>
</style>
person Gabriele Mariotti    schedule 04.09.2019
comment
@StayCool Я обновил ответ, пытаясь объяснить, почему вы не можете использовать тему editTextStyle в приложении. Вы можете определить стиль глобально, используя textInputStyle. - person Gabriele Mariotti; 21.05.2020
comment
Теперь, когда я нашел решение, я вижу, что ваш ответ правильный. - person StayCool; 21.05.2020