TextInputLayout:未聚焦时提示标签的颜色不同

2023-12-29

我想做的事:

当使用嵌入 TextInputLayout 中的 EditText 时,我想...

  1. 当标签失焦并漂浮在 EditText 上方时,将标签的颜色设置为绿色,因为用户已经输入了一些值
  2. 当标签失焦并位于 EditText 内时,将标签的颜色设置为红色,因为用户尚未输入值
  3. 我不想将所有 EditText 的提示文本颜色更改为红色,但只有当它们包装在 TextInputLayout 中时(我不需要通用方法 - 一种特定方法,例如为每个 TextInputLayout 设置主题/样式)布局 XML 就可以了)
  4. 当用户聚焦字段时,保留(即不更改)用于为浮动标签着色的强调色(黄色)。

我尝试过的:

将以下内容设置为 TextInputLayout 上的主题/样式确实满足 1. 但不满足 2.

<style name="FloatingLabel" parent="Widget.Design.TextInputLayout">
    <item name="android:textColorHint">@color/red</item>
</style>

在嵌入的 EditText 上设置特定颜色,将提示文本更改为另一种颜色:

 android:textColorHint="@color/text_placeholder_gray"

当标签从浮动位置移回 Edittext 作为提示(即没有文本)时,实际上会导致提示文本重叠。

设置这个:

<style name="TextAppearence.App.TextInputLayout" parent="@android:style/TextAppearance">
<item name="android:textColor">@color/main_color</item>

在文本输入布局上:

 <android.support.design.widget.TextInputLayout
  ...
   app:hintTextAppearance="@style/TextAppearence.App.TextInputLayout" >

更改提示标签颜色,但对于聚焦状态也会这样做 - 这意味着 4 不满足。

并且由于一张图片说了一千多个字(所有字段都处于非聚焦状态):

如何实现满足标准 1-4 的设置?


我遇到了类似的问题:我需要实现一个文本输入布局,其中标签对于空(当编辑文本中没有输入文本时)、“填充”和聚焦状态具有不同的颜色。我的主要问题是如何区分空状态和填充状态,因为使用选择器已经很容易为聚焦状态设置不同的颜色。最后,我决定定义一个自定义的“空文本”状态并实现我的自定义文本输入布局(它扩展了正常的文本输入布局)。

这是一些代码:

在 res/values/attrs.xml 中:

<?xml version="1.0" encoding="utf-8"?>
<resources>

...

    <!-- Custom state for the text input layout to determine whether the label is shown above some text or not -->
    <declare-styleable name="EmptyTextState">
        <attr name="state_empty_text" format="boolean"/>
    </declare-styleable>

</resources>

自定义文本输入布局:

public class EmptyStateTextInputLayout extends TextInputLayout {
    private boolean emptyText = true;
    private static final int[] EMPTY_TEXT_STATE = new int[]{R.attr.state_empty_text};

    public EmptyStateTextInputLayout(Context context) {
        super(context);
    }

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

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

    @Override
    protected int[] onCreateDrawableState(int extraSpace) {
        int[] state = super.onCreateDrawableState(extraSpace + 1);
        if (emptyText) {
            mergeDrawableStates(state, EMPTY_TEXT_STATE);
        }
        return state;
    }

    public void setEmptyTextState(boolean emptyTextState) {
        this.emptyText = emptyTextState;
        refreshDrawableState();
    }

    @Override
    public void addView(View child, int index, ViewGroup.LayoutParams params) {
        if (child instanceof EditText) {
            EditText editText = (EditText) child;
            if (!TextUtils.isEmpty(editText.getText())) {
                setEmptyTextState(false);
            }
            editText.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                }

                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                }

                @Override
                public void afterTextChanged(Editable editable) {
                    if (!TextUtils.isEmpty(editable)) {
                        setEmptyTextState(false);
                    } else {
                        setEmptyTextState(true);
                    }
                }
            });
        }
        super.addView(child, index, params);
    }
}

用于设置不同状态下标签颜色的 XML 选择器 (res/color/input_field_floating_label.xml):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:color="@color/focused_text_color" android:state_focused="true" />
    <item android:color="@color/placeholder_color" app:state_empty_text="true"/>
    <item android:color="@color/primary_text_color"/> <!-- default color -->
</selector>

输入文本布局的样式(在 res/values/styles.xml 中):

<style name="EditTextLayout">
    ...
    <item name="android:textColorHint">@color/input_field_floating_label</item>
</style>

编辑文本的主题和样式(仍在 res/values/styles.xml 中):

<style name="EditTextTheme">
    ...
    <item name="android:textColorHint">@color/input_field_floating_label</item>
</style>

<style name="EditText">
    <item name="android:theme">@style/EditTextTheme</item>
    ...
</style>

Usage:

<com.package.path.widget.EmptyStateTextInputLayout
            style="@style/DarkEditTextLayout"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            ...
            >

            <EditText
                style="@style/EditText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
</com.package.path.widget.EmptyStateTextInputLayout>

我推荐这篇博文来了解如何使用自定义状态:http://code.neenbedankt.com/example-of-custom-states-in-android-components/ http://code.neenbedankt.com/example-of-custom-states-in-android-components/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TextInputLayout:未聚焦时提示标签的颜色不同 的相关文章

随机推荐

  • 如何在Python中抑制控制台输出?

    我正在使用 Pygame SDL 的操纵杆模块从游戏手柄获取输入 每次我打电话给它get hat 方法将其打印到控制台 这是有问题的 因为我使用控制台来帮助我调试 现在它被淹没了SDL JoystickGetHat value 0 每秒60
  • 在 Glassfish v3 中,Servlet 请求无明显原因地按顺序执行

    我正在使用 Glassfish 3 Web 配置文件 无法让 http 工作线程在 servlet 上同时执行请求 这就是我观察问题的方式 我制作了一个非常简单的 servlet 它将当前线程名称写入标准输出并休眠 10 秒 protect
  • 信号处理程序问题

    我们一直在讨论 C Unix 中的信号 教授在课堂上举了一个让我困惑的例子 在下面的 main 方法中 使用包含的参数调用信号函数 main signal SIGALRM handler install handler handler 是一
  • get()在Guava的缓存中是线程安全的操作吗?

    我发现使用 CacheLoader 操作的 put 和 get 在底层使用了可重入锁 但为什么 getIfPresent 操作没有实现这一点 get 由 getIfPresent 使用 Nullable V get Object key i
  • setalloccol(x) 中的错误:详细必须为 TRUE 或 FALSE --- 未知错误源

    我在 Rstudio 中遇到了一个非常奇怪的问题 我不知道如何修复它 因为我不知道哪个函数 包导致了它 我昨晚运行了整个代码 它运行得很好 但现在我不断遇到错误Error in setalloccol x verbose must be T
  • 如何从“MySQL 创建表”查询字符串中获取列名?

    我想用 PHP 编写一个脚本 以字符串形式获取 MySQL 创建表 查询 并将列名及其数据类型存储在数组中 例如 输入字符串 CREATE TABLE test col1 INT 10 NOT NULL col2 VARCHAR 50 NO
  • 无模式 JDialog 不显示内容

    Java SE 6 我正在尝试创建一个弹出对话框 在我的程序执行一些耗时的工作时显示 请稍候 消息 为此 我选择使用无模式 JDialog 以便程序在 JDialog 可见时继续运行并正常工作 如果您使用模态 JDialog 则程序将暂停
  • Windows 上的 PHP 诅咒

    PHP 中是否有与 ncurses 相当的 Windows 版本 我创建了一个 CLI 脚本 希望以一种很好的方式显示各种统计信息 当前处理的记录 完成百分比等 而不向 cmd exe 窗口输出负载和大量文本 ncurses 扩展不适用于
  • 计算整数的持久数

    我正在尝试编写一个执行以下操作的代码 将整数的数字相乘并继续该过程给出 乘积序列总是得出令人惊讶的结果 一位数 例如 715 gt 35 gt 15 gt 5 88 gt 64 gt 24 gt 8 27 gt 14 gt 4 达到个位数所
  • 使用 map() 估计多个“lm”模型并在一个表中返回输出

    我需要在同一数据集上估计多个线性模型 并将回归结果全部放入一张表中 对于可重现的示例 这里是使用的简化mtcars formula 1 mpg disp formula 2 mpg log disp formula 3 mpg disp h
  • 我可以使用 System.Linq.Expressions 动态生成异步方法吗?

    我知道编译器无法将异步 lambda 表达式转换为表达式树 但是是否可以手动生成表达式树 var expr Expression Lambda
  • 模拟实体框架模型?

    是否可以模拟 EF 模型 以便我可以测试使用模型类的代码 而无需删除散布在我的项目中的 LINQ to Entities 代码 或者是否需要建立一个测试数据库来让模型命中 您可以将 LINQ 代码包装在数据访问对象 http en wiki
  • 如何在批处理脚本中生成日期前四天的日期? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在批处理脚本中生成日期前四天的日期 我检查了可用的解决方案 但它们看起来很复杂 任何帮助将不胜感激 我强烈同意 JosefZ 日期
  • 从函数返回 JSX

    我有一个组件需要检查多个选项并根据这些选项返回 因此 我创建了一个外部函数 在我的组件返回语句中调用该函数来确定将返回的格式 render const policy this props let deployment policy Depl
  • 如何更改 silverlight 5 中只读文本框的背景颜色?

    我想更改只读文本框的颜色 可以将默认颜色更改为白色 颜色 和文本框为
  • 如何正确通知 MediaScanner 有关文件夹的信息,即使在 Nexus/Kitkat 设备上也是如此?

    背景 我正在制作一个应用程序 将一些图像从互联网下载到定义为的特定文件夹中 final String pathToPutFiles Environment getExternalStoragePublicDirectory Environm
  • 字符串不匹配时的 Ansible 条件

    我正在尝试编写一个 Ansible 剧本 仅在 Nginx 尚未存在且当前版本不存在时才编译 Nginx 然而它每次都会编译 这是不可取的 这就是我所拥有的 shell usr local nginx sbin nginx v 2 gt 1
  • mediaelement.js - 如何隐藏音频控件?

    我正在尝试将 Mediaelement js 实现到视频和音频网站中 视频运行良好 但我需要做的是隐藏音频元素 这样它根本不会显示在页面上 并且 MEJS 音频控件酒吧不可见 音频的播放将通过根据需要播放 暂停音频的函数来处理 我尝试更改
  • Spring Batch:动态块大小

    我有步骤读取多个资源 我需要根据每个文件的行数更改块大小 Spring Batch是否可以具有动态块大小 或者有其他方法可以做到这一点 你可以做Spring Batch 步骤分区 对步骤进行分区 以便该步骤具有多个线程 每个线程并行处理一块
  • TextInputLayout:未聚焦时提示标签的颜色不同

    我想做的事 当使用嵌入 TextInputLayout 中的 EditText 时 我想 当标签失焦并漂浮在 EditText 上方时 将标签的颜色设置为绿色 因为用户已经输入了一些值 当标签失焦并位于 EditText 内时 将标签的颜色