"android:theme" 属性忽略重力

"android:theme" attribute ignore gravity

有我的app_style.xml

<style name="EditText.LargePassword" parent="Widget.AppCompat.EditText">
    <item name="android:gravity">center_horizontal</item>
    <item name="android:imeOptions">flagNoExtractUi</item>
    <item name="android:inputType">numberPassword</item>

    <item name="android:textColorPrimary">@color/white</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:textColorHint">@color/white</item>
    <item name="android:textSize">56sp</item>

    <item name="colorControlNormal">@color/white</item>
    <item name="colorControlActivated">@color/white</item>
    <item name="colorControlHighlight">@color/white</item>
</style>

和部分布局:

<EditText
    android:id="@+id/password_edit_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="@dimen/giant_margin"
    android:layout_marginRight="@dimen/giant_margin"
    android:theme="@style/EditText.LargePassword"
    tools:text="12345"
    tools:ignore="TextFields"
    />

如您所见,我通过 android:theme 属性应用 EditText.LargePassword 样式:

存在一个问题:应用了每个属性,除了 android:gravity

好的,让我们试试 style 属性:

style="@style/EditText.LargePassword"

轰!指示器和光标不见了:

但现在 android:gravity="center_horizontal" 有效。

据我阅读,style == theme,但 style 不适用于 children View。有什么不同吗?这是一个错误吗?

样式和主题虽然相似但并不完全相同。样式仅适用于一个特定视图,而主题将适用于 View/ViewGroup/Activity 及其所有子视图。

在您的情况下,您实际上是将样式和主题的属性混合到一个设置中,这就是它无法正常工作的原因。要获得两者,您需要获取三个 colorControl 属性并将它们定义为主题:

<style name="LargePasswordTheme" >
    <item name="colorControlNormal">@color/white</item>
    <item name="colorControlActivated">@color/white</item>
    <item name="colorControlHighlight">@color/white</item>
</style>

其余的可以留作风格。然后你可以将这个和你的样式添加到 EditText:

<EditText
    android:id="@+id/password_edit_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="@dimen/giant_margin"
    android:layout_marginRight="@dimen/giant_margin"
    android:theme="@style/LargePasswordTheme"
    android:style="@style/EditText.LargePassword"
    tools:text="12345"
    tools:ignore="TextFields"
    />

可以找到有很好解释的进一步阅读 here and here