如何将全局自定义样式应用于android.support.design.widget.TextInputEditText?

14

我的AppThemestyle.xml中定义,在其中为我应用程序的所有TextViewEditTextButton等全局应用自定义样式。

现在我想对android.support.design.widget.TextInputEditText执行同样的操作,但该如何实现?

它不扩展EditText,因此该样式被忽略了。

以下是我的代码:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>

    <style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/primary</item>
        <item name="colorPrimaryDark">@color/primary</item>
        <item name="colorAccent">@color/accent</item>

        <!-- Globally override default widget styles with custom -->
        <item name="android:textViewStyle">@style/App.TextView</item>
        <item name="android:editTextStyle">@style/App.EditText</item>
        <item name="android:buttonStyle">@style/App.Button.Primary</item>
    </style>

    <style name="App.TextView" parent="@android:style/Widget.TextView">
        <item name="android:textColor">@color/text</item>
        <item name="android:fontFamily">sans-serif-light</item>
        <item name="android:textSize">@dimen/textsize_normal</item>
    </style>

    <style name="App.EditText" parent="@android:style/Widget.EditText">
        <item name="android:textColor">#f00</item>
        <item name="android:fontFamily">sans-serif-light</item>
        <item name="android:textSize">@dimen/textsize_xxxlarge</item>
        <item name="android:textStyle">bold</item>
        <item name="android:textColorHint">@color/text_hint</item>
    </style>

    <style name="App.Button" parent="@android:style/Widget.Button">
        <item name="android:textSize">@dimen/button_text_size</item>
        <item name="android:fontFamily">sans-serif-medium</item>
        <item name="android:textAllCaps">false</item>
    </style>

    <style name="App.Button.Primary">
        <item name="android:background">@drawable/button_primary_background</item>
        <item name="android:height">@dimen/button_primary_height</item>
        <item name="android:width">@dimen/button_primary_width</item>
        <item name="android:paddingLeft">@dimen/padding_normal</item>
        <item name="android:paddingRight">@dimen/padding_normal</item>
        <item name="android:textColor">@color/button_primary_text</item>
    </style>

    ...

它实际上扩展了AppCompatEditText,而AppCompatEditText又扩展了EditText。但是你说得对,样式并没有被扩展。 - SafaOrhan
你找到了吗,@Stephan? - thushcapone
@thushcapone 不,问题仍然存在。自从那以后我还没有机会去研究它,但是如果有解决方案仍然欢迎,因为我仍然把它放在我的待办事项中。 - Stephan Henningsen
2个回答

6
使用Material主题,您可以使用textInputStyle来设置com.google.android.material.textfield.TextInputLayout组件的样式。
<style name="AppTheme" parent="Theme.MaterialComponents.Light">
   ....
   <item name="textInputStyle">@style/MyTextInputLayoutStyle</item>
</style>

<style name=MyTextInputLayoutStyle" parent="@style/Widget.MaterialComponents.TextInputLayout.FilledBox">
     ....
</style>

如果您想自定义TextInputEditText,只需添加以下内容: TextInputEditText
<style name=MyTextInputLayoutStyle" parent="@style/Widget.MaterialComponents.TextInputLayout.FilledBox">
     ....
    <item name="materialThemeOverlay">
      @style/MyThemeOverlayTextInputEditTextFilledBox</item>
</style>

<style name="MyThemeOverlayTextInputEditTextFilledBox">
   <item name="editTextStyle">@style/MyTextInputEditText</item>
</style>

例如:

  <style name="MyTextInputEditText" parent="@style/Widget.MaterialComponents.TextInputEditText.FilledBox">
    <item name="android:paddingTop">8dp</item>
    <item name="android:paddingBottom">8dp</item>
    <item name="android:textAppearance">myTextAppearance</item>
    ...
  </style>

0
新的 MDC 组件在这里允许很多灵活性,但仍然非常奇怪。我想要为所有 TextInputEditText 自定义字体,并使用填充(默认)样式。唯一适用于我的方法是使用全局样式属性在 TextInputEditText 上指定字体:
<!-- Base application theme. -->
<style name="MyAppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="textInputStyle">@style/MyTextField.Outlined</item>
    <item name="editTextStyle">@style/MyEditTextFont</item>
</style>

<style name="MyEditTextFont" parent="Widget.MaterialComponents.TextInputEditText.FilledBox">
    <item name="android:fontFamily">@font/my_font</item>
</style>
<style name="MyTextField" parent="Widget.MaterialComponents.TextInputLayout.FilledBox"/>
<style name="MyTextField.Outlined" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox"/>

如果你不指定editTextStyle,那么textInputStyle虽然有效,但会出现奇怪的缺失填充。无论如何,我建议同时使用这两个字段并根据需要进行样式设置。


不要在应用程序主题中更改editTextStyle。它是全局有效的。只需在TextInputLayout样式中使用materialThemeOverlay属性,仅为这些组件覆盖TextInputEditText样式即可。 - Gabriele Mariotti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接