Android主题中全局设置EditText样式不起作用。

24

我遇到了问题。我正在尝试通过主题的帮助使我的应用程序中的编辑文本看起来相同。
我使用在线工具(9-patch图像)生成了样式,并尝试将其设置在我的主题中,就像这样:

   <!-- Base application theme. -->
    <style name="DefaultAppTheme" parent="Theme.AppCompat">
        <!-- Main theme colors -->
        <!--   your app branding color for the app bar -->
        <item name="colorPrimary">@color/blue</item>
        <!--   darker variant for the status bar and contextual app bars -->
        <item name="colorPrimaryDark">@color/darkblue</item>
        <!--   theme UI controls like checkboxes and text fields -->
        <item name="colorAccent">@color/cornflowerblue</item>
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="android:editTextStyle">@style/EditTextDefault</item>
    </style>

编辑文本的样式

<style name="EditTextDefault" parent="android:Widget.EditText">
        <item name="android:background">@drawable/edit_text_holo_light</item>
        <item name="android:textColor">@color/light_blue</item>
        <item name="android:layout_marginLeft">@dimen/margin_edit_text_default</item>
        <item name="android:layout_marginRight">@dimen/margin_edit_text_default</item>
        <item name="android:layout_marginTop">@dimen/margin_edit_text_default</item>
    </style>
但是,如果没有为每个编辑文本手动指定样式,则无法使用编辑文本。
这不起作用。
<EditText
    android:id="@+id/edit_text_login"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/edit_text_password"
    android:hint="@string/hint_enter_login"
    android:inputType="textEmailAddress" />

这个有效。

<EditText
    android:id="@+id/edit_text_login"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/edit_text_password"
    style="@style/EditTextDefault"
    android:hint="@string/hint_enter_login"
    android:inputType="textEmailAddress" />

我知道layout_*参数在主题中不会起作用,但其他属性应该可以使用。

请帮忙解决这个问题。


2
很奇怪...相同的设置(尽管EditTextDefault应该从@android:style/Widget.EditText继承,而不是android:Widget.EditText)在我这里可以正常工作,无需为EditText指定style标签。 - Bartek Lipinski
@blipinsk 你是正确的。 - IntelliJ Amiya
你也可以在默认主题中使用这行代码:<item name="editTextColor">@color/black</item>。 - Emre A
4个回答

64

不要改成这样...

<item name="android:editTextStyle">@style/EditTextDefault</item>

使用此功能可轻松完成任务。

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

这是一种资源风格,支持您正在运行的API,您可以同时使用。 - Jongz Puangput
非常感谢!我可以将相同的逻辑用于其他组件吗? - Ângelo Polotto

5

你应该怎么做

请使用@android:style/Widget.EditText,而不是parent="android:Widget.EditText"。我希望它能对你有所帮助。

请阅读此stackoverflow答案: 设置所有EditText的一致样式

<style name="EditTextDefault" parent="@android:style/Widget.EditText">

4
如果您正在使用AppCompat版本大于v22,您可以尝试使用以下方法:
<style name="EditText.Colored" parent="Theme.AppCompat">
    <item name="colorControlNormal">@color/colorNormal</item>
    <item name="colorControlActivated">@color/colorActivated</item>
    <item name="colorControlHighlight">@color/colorControlHighlight</item>
</style>

并且在你的layout.xml文件中将android:theme属性设置为edittext。

<EditText
    android:id="@+id/edit_text_login"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/edit_text_password"
    android:theme="@style/EditText.Colored"
    android:hint="@string/hint_enter_login"
    android:inputType="textEmailAddress" />

1
你知道是否有一种方法可以在应用程序主题中设置EditText主题吗? - Ionut Negru

1
除了修复 Widget.EditText 的引用外:
<style name="EditTextDefault" parent="@android:style/Widget.EditText">

你需要创建一个“主题”,并在清单文件中应用它。如下所示:

<application
    ...
    android:theme="@android:style/DefaultAppTheme" >
</application>

你能否开发一个通用的主题,仅适用于EditText吗?你正在用EditText覆盖一般应用程序主题,这没有任何意义。 - Daniel Gomez Rico

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