I need to add code-like theme to the user input in EditText. The way I do it is by lexing text into tokens and each token has value and type, the same type has the same color. After that, I load those tokens into my EditText and color them, however, a wired bug happens.
This is an example of the bug:
Everything is coloring ok at the begining
This happens after:
This is weird because my lexer works fine, this is the console output:
ColoredToken{key='KEYWORD', value='int'}
ColoredToken{key='SPACE', value=' '}
ColoredToken{key='NAME', value='a'}
ColoredToken{key='SPACE', value=' '}
ColoredToken{key='SIGNS', value='='}
ColoredToken{key='SPACE', value=' '}
ColoredToken{key='BID', value='10'}
ColoredToken{key='KEYWORD', value='if'}
ColoredToken{key='SPACE', value=' '}
ColoredToken{key='SIGNS', value='('}
ColoredToken{key='SIGNS', value=')'}
ColoredToken{key='SPACE', value=' '}
ColoredToken{key='SIGNS', value='{'}
ColoredToken{key='SPACE', value=' '}
ColoredToken{key='SPACE', value=' '}
ColoredToken{key='KEYWORD', value='int'}
ColoredToken{key='SPACE', value=' '}
ColoredToken{key='NAME', value='b'}
ColoredToken{key='SPACE', value=' '}
ColoredToken{key='SIGNS', value='='}
ColoredToken{key='SPACE', value=' '}
ColoredToken{key='BID', value='10'}
ColoredToken{key='SIGNS', value='}'}
Now for you to understand, the blue color is for names as in the first picture, white for keywords and signs, problem is that after typing for a while everything starts turning in blue, while tokens being correct.
This is the code for coloring and loading tokens:
public static SpannableStringBuilder runCodeColor(String codeString) {
ArrayList<String> code = new ArrayList<>(Arrays.asList(codeString.split("\n")));
SpannableStringBuilder coloredCode = new SpannableStringBuilder("");
int newLines = countNewLine(codeString);
for (int i = 0; i < code.size(); i++) {
ArrayList<ColoredToken> tmpTokens = new ArrayList<>(ColoredLexer.lexer(code.get(i)));
for (int j = 0; j < tmpTokens.size(); j++) {
coloredCode.append(tmpTokens.get(j).getValue());
coloredCode.setSpan(tmpTokens.get(j).getDarkColorSpan(), coloredCode.length() - tmpTokens.get(j).getValue().length(), coloredCode.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
System.out.println(tmpTokens.get(j).toString());
}
if (newLines > 0) {
coloredCode.append("\n");
newLines--;
}
}
return coloredCode;
}
If needed I can provide lexer code, but as stated above the tokens are alright, coloring is what's problematic.
EDIT: If someone knows better ways of coloring/theming the code it would be great if you could provide some sample code and an explanation of how it works.
