问题:在Android中更改未聚焦的TextInputLayout的边框颜色或框线。

63

我有一个非常具体的问题,需要改变TextInputLayout文本框在未聚焦时的轮廓。 我找不到可以更改“未聚焦”文本框边框颜色的属性。

这是我尝试做的事情的可视化示例:

这个(文本框)的颜色:边框不是白色。当前它没有聚焦。 当我点击它时,它变成了白色:

我不知道我需要改变什么,看起来好像没有可以改变它的属性。

我还使用Material Design文本输入布局样式,尽管我不知道是否会影响它。

这是我的文本框的xml代码:

 <other layouts ... >
     <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="70dp"
            android:layout_gravity="bottom"
            android:layout_margin="5dp"
            android:background="@drawable/item_recycler_view">

            <android.support.design.widget.TextInputLayout
                android:id="@+id/dialog_text_input_layout"
                style="@style/Widget.AppTheme.TextInputLayoutList"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Quick Add..."
                android:textColorHint="@color/colorWhite"
                app:boxStrokeColor="@color/colorWhite"
                app:errorEnabled="true"
                >

                <android.support.design.widget.TextInputEditText
                    android:id="@+id/dialog_edit_text"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="text"
                    android:maxLines="1"
                    android:textColor="@color/colorWhite"
                    android:textSize="14sp" />
            </android.support.design.widget.TextInputLayout>
        </RelativeLayout>
 </other layouts...>

以下是我使用的样式:

<style name="TextAppearance.AppTheme.TextInputLayout.HintTextAlt" parent="TextAppearance.MaterialComponents.Subtitle2">
    <item name="android:textColor">@color/colorWhite</item>
</style>

<style name="Widget.AppTheme.TextInputLayoutList" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox">
    <item name="hintTextAppearance">@style/TextAppearance.AppTheme.TextInputLayout.HintTextAlt</item>
    <item name="boxStrokeColor">@color/colorWhite</item>
    <item name="boxCornerRadiusBottomEnd">5dp</item>
    <item name="boxCornerRadiusBottomStart">5dp</item>
    <item name="boxCornerRadiusTopEnd">5dp</item>
    <item name="boxCornerRadiusTopStart">5dp</item>
    <item name="android:layout_margin">5dp</item>
</style>

谢谢,欢迎提供任何帮助或建议!


尝试使用 set focus 方法。 - Amjad
@Amjad,我不确定什么是焦点方法,你有任何例子吗? - Varun Govind
如果你想在开始时将其集中,可以设置属性。 - Amjad
设置为可聚焦不起作用 :( - Varun Govind
抱歉,我的意思是 android:focusedByDefault="true" 这个属性。它将在开始时获得焦点。 - Amjad
如果您想在未聚焦模式下更改默认颜色,请参考我对这个问题的回答。 - Amjad
4个回答

132

如果您想在未聚焦模式下设置轮廓框的颜色而不是默认的黑色,则必须在colors.xml文件中添加此行,它将覆盖轮廓框的默认颜色。

请按原样复制此行。您可以将颜色更改为所需颜色。

<color name="mtrl_textinput_default_box_stroke_color">#fff</color>
直到现在它都能正常工作,若想更好地控制TextInputLayout,您可以在styles.xml中添加此样式。
<style name="TextInputLayoutStyle" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense">
    <item name="boxStrokeColor">#fff</item>
    <item name="boxStrokeWidth">2dp</item>
</style>

然后将主题添加到TextInputLayout

android:theme="@style/TextInputLayoutStyle"

1
哦,谢谢!这对我有用!如果可以问一下,你是怎么找到这个的? - Varun Govind
3
@VarunGovind 您好,希望您能点赞这个答案,它对我很有帮助。如需更多信息,可以在 github 的讨论区 此处 查看,如果需要查看 color.xml 中更多的默认值,可以访问 此处,或者访问 此处 获取更多信息。 - Amjad
1
对我来说不起作用。当选中时它会改变颜色,但默认颜色仍然是黑色。 - akshay bhange
2
我该如何通过编程方式进行设置? - Rohan Taneja
5
'<color name="mtrl_textinput_default_box_stroke_color">#fff</color>' 这会将所有的TextInputLayout都改为白色,如果我只想在单个活动或片段中更改它,该怎么办? - Arpan
显示剩余2条评论

43

使用 Material Components 库,只需使用 boxStrokeColor 属性即可。
它可以与选择器一起使用。

只需像这样使用:

    <com.google.android.material.textfield.TextInputLayout
        app:boxStrokeColor="@color/text_input_layout_stroke_color"
        ..>
with:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:alpha="..." android:color="@color/...." android:state_focused="true"/>
  <item android:alpha="..." android:color="@color/...." android:state_hovered="true"/>
  <item android:alpha="..." android:color="@color/...." android:state_enabled="false"/>
  <item android:alpha="..." android:color="@color/...."/>  <!-- unfocused -->
</selector>

enter image description hereenter image description here


对于想要了解的每个人,这可以针对项目中的每个特定TextInputLayout单独应用。只需为您的颜色制作单独的.xml文件,例如text_input_layout_stroke_green、text_input_layout_stroke_yellow、text_input_layout_stroke_red等。然后在这些xml文件中自定义每个特定文件的颜色。希望能帮助到某些人 =) - Linus
无法在材料主题中工作。 - Ankita Singh
@AnkitaSingh 你确定吗?你的应用程序使用哪个主题? - Gabriele Mariotti

23

Amjad的回答是正确的,但从1.1.0-alpha02开始(可能甚至是alpha01),在解决了此问题之后,可以使用相同的boxStrokeColor属性在颜色状态列表中定义颜色,例如在库中所做的方式:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:color="?attr/colorPrimary" android:state_focused="true"/>
  <item android:alpha="0.87" android:color="?attr/colorOnSurface" android:state_hovered="true"/>
  <item android:alpha="0.12" android:color="?attr/colorOnSurface" android:state_enabled="false"/>
  <item android:alpha="0.38" android:color="?attr/colorOnSurface"/>
</selector>

使用方法:

...
app:boxStrokeColor="@color/text_input_layout_stroke_color"
...

4
如何将此选择器添加到TextInputLayout中? - Kavin Raju S
10
对于任何新手来说,选择器text_input_layout_stroke_color必须在res/color中创建,而不是在res/drawable中。 - Andrei Manolache

9
app:boxStrokeColor="#000000"
app:boxStrokeWidthFocused="0.5dp"
app:boxStrokeWidth="0.5dp"

这将使盒子颜色保持不变,即使它获得了焦点!

不,不正确,应该是不同的颜色。 - user924

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