【发布时间】:2011-11-07 22:46:47
【问题描述】:
提前感谢您的任何回复。
我正在尝试在我的 Android 应用程序中添加一个 EditText,它对输入的不同字符具有不同的颜色。
例如字母“A”应始终为蓝色,字母“b”应始终为绿色……以此类推。
到目前为止,我还没有找到解决方案。 请善待我,指引我正确的方向。
【问题讨论】:
提前感谢您的任何回复。
我正在尝试在我的 Android 应用程序中添加一个 EditText,它对输入的不同字符具有不同的颜色。
例如字母“A”应始终为蓝色,字母“b”应始终为绿色……以此类推。
到目前为止,我还没有找到解决方案。 请善待我,指引我正确的方向。
【问题讨论】:
正如所指出的,您可以在输入文本时将 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 再次运行,所以我检查了文本是否真的改变了。此外,光标位置未正确保存,因此我也将其存储并恢复。
【讨论】:
您可能希望将每个字母包装在其自己的ForegroundColorSpan 中。添加TextWatcher 并在编辑文本时应用 Spannables。
【讨论】:
您最好的方法可能是覆盖 EditText 并编写自己的 draw()。但是这种方式很疯狂,因为它通常是覆盖内置视图类。
【讨论】:
如果我是你,我最好使用InputFilter。 textWatcher{} onTextChange() 中的 setText() 存在一些问题(例如,在软键盘上您无法选择国家字母)。
【讨论】: