I created simple code for highlight syntax in EditText
.
First i created a HashMap
to store keywords and colors.
Map<String,Integer> map = new HashMap<>();
map.put("public",Color.CYAN);
map.put("void", Color.BLUE);
map.put("String",Color.RED);
Then I added a TextWatcher
for the EditText
.
In afterTextChanged
method I used following code to set colors to each keyword,
........
@Override
public void afterTextChanged(Editable editable) {
String string = editable.toString();
String[] split = string.split("\\s");
for(int i = 0 ; i < split.length ; i++){
String s = split[i];
if(map.containsKey(s)){
int index = string.indexOf(s);
int color = map.get(s);
editable.setSpan(new ForegroundColorSpan(color),
index,
index + s.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
This code is working, if i type different words, like "public void String", but It's not working when I type same word, "public public public". It only set color to the first word.
How can i make this work ? Thank you.
Using string.indexOf(s)
will get the first occurrence. Instead of having a map of keywords and using indexOf
you could use a regular expression. I wrote this up real quick as an example:
Screenshot of example EditText below:
Example:
final EditText editText = new EditText(this);
editText.addTextChangedListener(new TextWatcher() {
ColorScheme keywords = new ColorScheme(
Pattern.compile(
"\\b(package|transient|strictfp|void|char|short|int|long|double|float|const|static|volatile|byte|boolean|class|interface|native|private|protected|public|final|abstract|synchronized|enum|instanceof|assert|if|else|switch|case|default|break|goto|return|for|while|do|continue|new|throw|throws|try|catch|finally|this|super|extends|implements|import|true|false|null)\\b"),
Color.CYAN
);
ColorScheme numbers = new ColorScheme(
Pattern.compile("(\\b(\\d*[.]?\\d+)\\b)"),
Color.BLUE
);
final ColorScheme[] schemes = { keywords, numbers };
@Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override public void afterTextChanged(Editable s) {
removeSpans(s, ForegroundColorSpan.class);
for (ColorScheme scheme : schemes) {
for(Matcher m = scheme.pattern.matcher(s); m.find();) {
s.setSpan(new ForegroundColorSpan(scheme.color),
m.start(),
m.end(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
void removeSpans(Editable e, Class<? extends CharacterStyle> type) {
CharacterStyle[] spans = e.getSpans(0, e.length(), type);
for (CharacterStyle span : spans) {
e.removeSpan(span);
}
}
class ColorScheme {
final Pattern pattern;
final int color;
ColorScheme(Pattern pattern, int color) {
this.pattern = pattern;
this.color = color;
}
}
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With