当前位置: 首页 > 知识库问答 >
问题:

以编程方式设置TextInputLayout的样式

童琪
2023-03-14

有没有办法以编程方式自定义这些TextInputLayout属性:

  • textColorHint
  • 彩色口音
  • 颜色控制正常
  • 颜色控制已激活
  • 文本选择句柄

我知道如何使用主题属性对它们进行样式化,但是我正在处理的项目动态地加载颜色信息,据我所知,在运行时无法更改主题/样式值。

共有1个答案

邢璞
2023-03-14

我编写了textInputLayout实现,它可以设置任何颜色的下划线和错误,并在顶部显示错误。

public class TextInputLayoutUseful extends TextInputLayout {
private CharSequence originalHint = "";

public TextInputLayoutUseful(Context context) {
    super(context);
    init();
}

public TextInputLayoutUseful(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public TextInputLayoutUseful(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

private void init() {
    this.originalHint = getHint();
    setErrorEnabled(false);
}

/**
 * - put error text into top floating label
 * - colorized layout
 *
 * @param error error text
 */
@Override
public void setError(@Nullable CharSequence error) {
    if (error == null) {
        setHint(originalHint);
        setHintTextAppearance(R.style.InputLayoutNormalHint);
        setUnderlineColor(R.color.input_normal_accent);
    } else {
        setHint(error);
        setHintTextAppearance(R.style.InputLayoutErrorHint);
        setUnderlineColor(R.color.input_error_accent);
    }
}

/**
 * colorized layout specified green color
 *
 * @param acceptedHint text for floating label
 */
public void setGreenError(@NonNull CharSequence acceptedHint) {
    setHint(acceptedHint);
    setHintTextAppearance(R.style.InputLayoutAcceptedHint);
    setUnderlineColor(R.color.input_accepted_accent);
}

private void setUnderlineColor(@ColorRes int colorRes) {
    if (getEditText() != null) {
        getEditText().getBackground().mutate().setColorFilter(ContextCompat.getColor(getContext(), colorRes), PorterDuff.Mode.SRC_ATOP);
    }
}
}

风格

<style name="InputLayoutErrorHint" parent="TextAppearance.AppCompat">
    <item name="android:textColor">@color/input_error_accent</item>
</style>

<style name="InputLayoutNormalHint" parent="TextAppearance.AppCompat">
    <item name="android:textColor">@color/input_normal_accent</item>
</style>

<style name="InputLayoutAcceptedHint" parent="TextAppearance.AppCompat">
    <item name="android:textColor">@color/input_accepted_accent</item>
</style>
 类似资料:
  • 如何以编程方式设置属性?

  • 如何在java中向文本视图添加样式?我试图在我的价值观/风格下添加一个。xml,而不是单独添加每个属性。

  • 问题内容: 我正在尝试在应用程序启动期间进行设置,但似乎为时已晚,非无头模式已经启动: 除此之外,还有另一种方法让无头为真吗?我不希望在控制台上进行任何配置。 问题答案: 我正在使用一个类,该类在常量(和其他静态代码)中静态加载JFreeChart的不同部分。 将静态加载块移到类的顶部解决了我的问题。 这不起作用: 通过将Java移动到类的顶部,让Java尽早执行该静态块! 当考虑它时,这是完全有

  • 问题内容: 我的活动中有和。最初设置为我需要一个功能,例如用户单击,绑定并显示为“ Wrap_Content”。到目前为止,我已经编写了代码 我的XMl文件 Java代码 ViewAnimationUtils类 在这段代码中,我正在调用类的函数。在扩展功能中,我将布局高度设置为,但是Listview渲染高度最多只显示一项。绑定有8个项目。 如何设置高度以显示列表中的所有项目? 问题答案: 这将为您

  • 问题内容: 有没有一种方法可以通过编程设置属性?似乎没有方法。 明确地说,我不是在谈论视图/窗口小部件样式!我在谈论以下内容: 问题答案: setTypeface是属性textStyle。 正如 Shankar V 添加的那样,要保留以前设置的字体属性,可以使用:

  • 我习惯于用JavaFx编写如下所示的代码,因为这就是我几年前学习的方式。 我最近安装了JetBrains IntelliJ IDEA Ultimate Edition 2018.1.6,我发现要打开primaryStage窗口,我需要一个fxml文件。 我必须这么做, 如果我运行第一个代码片段,什么都不会显示。但是如果我用FXMLLoader.load(getClass(). getResourc