【问题标题】:Android: Different colours for different characters in EditTextAndroid:EditText中不同字符的不同颜色
【发布时间】:2011-11-07 22:46:47
【问题描述】:

提前感谢您的任何回复。

我正在尝试在我的 Android 应用程序中添加一个 EditText,它对输入的不同字符具有不同的颜色。

例如字母“A”应始终为蓝色,字母“b”应始终为绿色……以此类推。

到目前为止,我还没有找到解决方案。 请善待我,指引我正确的方向。

【问题讨论】:

    标签: android android-edittext


    【解决方案1】:

    正如所指出的,您可以在输入文本时将 Spannables 应用于文本。像这样的:

    colorEdit.addTextChangedListener(new TextWatcher() {
    
        String lastText = null;
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            Log.d("", "lastText='" + lastText + "'");
            Log.d("", "s='" + s + "'");
            if (!s.toString().equals(lastText)) {
                lastText = s.toString();
    
                String res = "";
                char[] split = s.toString().toCharArray();
                for (char c : split) {
                    String color = null;
                    if (c == 'a') {
                        color = "red";
                    } else if (c == 'b') {
                        color = "green";
                    } else if (c == 'c') {
                        color = "blue";
                    }
                    // etc...
                    if (color != null) {
                        res += "<font color=\"" + color + "\">" + c
                                + "</font>";
                    } else {
                        res += c;
                    }
                }
                int selectStart = colorEdit.getSelectionStart();
                int selectEnd = colorEdit.getSelectionEnd();
                colorEdit.setText(Html.fromHtml(res));
                colorEdit.setSelection(selectStart, selectEnd);
            }
        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
    
        @Override
        public void afterTextChanged(Editable s) {}
    });
    

    有些事情需要注意,我打电话给setText 这当然会导致onTextChanged 再次运行,所以我检查了文本是否真的改变了。此外,光标位置未正确保存,因此我也将其存储并恢复。

    【讨论】:

      【解决方案2】:

      您可能希望将每个字母包装在其自己的ForegroundColorSpan 中。添加TextWatcher 并在编辑文本时应用 Spannables。

      【讨论】:

        【解决方案3】:

        您最好的方法可能是覆盖 EditText 并编写自己的 draw()。但是这种方式很疯狂,因为它通常是覆盖内置视图类。

        【讨论】:

        • 我开始怀疑按照你说的去做可能是我唯一的选择。但是,我也在考虑将 onClick 侦听器添加到 EditText 小部件的虚拟图像中,然后使用输入文本将字符替换为自行设计的字符图像。还没有考虑过这一点,但我认为它可能会作为最后的手段/或您的解决方案来完成这项工作(这是正确的方法,但是是的,疯狂)。
        【解决方案4】:

        如果我是你,我最好使用InputFiltertextWatcher{} onTextChange() 中的 setText() 存在一些问题(例如,在软键盘上您无法选择国家字母)。

        Some issue with the TextWatcher

        Documentation

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-24
          • 1970-01-01
          • 2014-09-29
          • 1970-01-01
          • 1970-01-01
          • 2017-08-08
          • 2011-12-26
          • 1970-01-01
          相关资源
          最近更新 更多