Wired coloring issue Android EditText

Viewed 36

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 beginingenter image description here

This happens after:

enter image description here

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.

1 Answers

Try to use textprocessor so that you do not have to implement this yourself, you can even train it for your own language

Related