【问题标题】:How to change boxStrokeColor Of TextInputLayout in Android?如何在 Android 中更改 TextInputLayout 的 boxStrokeColor?
【发布时间】:2021-04-10 13:43:39
【问题描述】:

我使用下面的代码动态创建 textInputlayout 并将其添加到我的 Linarlayot:

        LinearLayout.LayoutParams params = new 
        LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 
        LinearLayout.LayoutParams.WRAP_CONTENT);
        params.setMargins(10,10,10,10);
        til.setLayoutParams(params);
        til.setHint("Label");
        til.setId(i+1);
        TextInputEditText et = new TextInputEditText(til.getContext());  
        et.setSingleLine(true);
        til.addView(et);
        til.setBoxCornerRadii(R.dimen.CornerRadious,R.dimen.CornerRadious,R.dimen.CornerRadious,
        R.dimen.CornerRadious);
        information.addView(til);

我想更改 boxStrokeColor 、 CursorColor 和 HintTextColor 。

我使用下面的代码块来改变 boxStrokeColor

 til.setBoxStrokeColor(getResources().getColor(R.color.white));

但是当我单击 TextInputLayout 时,该代码块仅更改 TextInputLayout 的 boxStrokeColor (白色),而不单击它的颜色为黑色。如何设置它的颜色为白色?

【问题讨论】:

  • 也发布第一行,您在其中初始化 til,以及使用的应用程序主题。

标签: android colors dynamically-generated android-textinputlayout


【解决方案1】:

您必须使用选择器(ColorStateList) 否则只有在获得焦点时才会将单个值应用于框。

使用方法setBoxStrokeColorStateList

til.setBoxStrokeColorStateList(ContextCompat.getColorStateList(this.R.color.selector))

selector 类似于:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/...." android:state_focused="true"/>
    <item android:color="@color/...." android:state_hovered="true"/>
    <item android:color="@color/...." android:state_enabled="false"/>
    <item android:color="@color/...."/>
</selector>

注意:至少需要材料组件库的1.2.0版本。

如果你想使用 xml 中定义的样式,还有另一种选择:

attrs.xml 中定义一个自定义属性:

<attr name="customTextInputStyle" format="reference" />

然后在你的主题中添加这个属性:

<style name="AppTheme" parent="Theme.MaterialComponents.*">
    <!-- ..... -->
    <item name="customTextInputStyle">@style/Widget.App.TextInputLayout.OutlinedBox</item>
</style>

现在您可以在新样式中添加所有属性:

<style name="Widget.App.TextInputLayout.OutlinedBox" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox">
    <item name="boxStrokeColor">@color/boxstroke_selector</item>
    <!-- .... -->
    <item name="materialThemeOverlay">@style/ThemeOverlay.App.TextInputEditText.OutlinedBox</item>
</style>

<style name="ThemeOverlay.App.TextInputEditText.OutlinedBox"
    parent="ThemeOverlay.MaterialComponents.TextInputEditText.OutlinedBox">
    <!-- to change the cursor color -->
    <item name="colorControlActivated">@color/teal_200</item>
</style>

最后创建你的TextInputLayout

TextInputLayout til = new TextInputLayout(this,null,R.attr.customTextInputStyle);

【讨论】:

  • 我的盒子颜色没变还是黑
  • 当我将材质版本从 1.1.0 更改为 1.2.0 或 1.3.0 时出现 2 渲染问题 2
  • @Neo 您应该更好地检查更新库中的问题。无论如何,您仍然可以使用 xml 中定义的样式。
  • 1.1.0版本我可以单击输入textInputlayouta,更改版本后我必须单击两次才能输入数据并且我创建的textInputlayout的格式被破坏了。
  • 如何改变光标颜色?我使用 但不工作
【解决方案2】:

我建议使用XML,而不是全部使用代码。 您必须在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">#000</item>
    <item name="boxStrokeWidth">2dp</item>
    <item name="hintTextColor">#000</item>
    <item name="android:theme">@style/exampleCursor</item>
</style>

<style name="exampleCursor" parent="ThemeOverlay.MaterialComponents.TextInputEditText.OutlinedBox">
    <item name="colorControlActivated">@color/green</item>
</style>

然后给TextInputLayout添加主题:

style="@style/TextInputLayoutStyle"

【讨论】:

  • 我是动态创建的,所以不能使用android:theme="@style/TextInputLayoutStyle"
猜你喜欢
  • 1970-01-01
  • 2019-07-18
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多