Android:EditText中不同字符的不同颜色

时间:2011-11-07 22:46:47

标签: android android-edittext

提前感谢您的回复。

我想在我的Android应用程序中创建一个EditText,它为输入的不同字符设置了不同的颜色。

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

到目前为止,我无法找到解决方案。 请善意引导我朝着正确的方向前进。

4 个答案:

答案 0 :(得分:7)

正如所指出的,您可以在输入时将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再次运行,所以我检查文本是否实际发生了变化。此外,光标位置未正确保存,因此我也存储并恢复它。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果我是你,我最好使用InputFiltersetText()中的textWatcher{} onTextChange()有一些问题(例如,在软键盘上,您无法选择国家级信件)。

Some issue with the TextWatcher

Documentation