Проблема с проводной раскраской Android EditText

#java #android #android-studio #android-edittext

#java #Android #android-studio #android-edittext

Вопрос:

Мне нужно добавить тему, похожую на код, к пользовательскому вводу в EditText. Я делаю это путем преобразования текста в токены, и каждый токен имеет значение и тип, один и тот же тип имеет один и тот же цвет. После этого я загружаю эти токены в свой EditText и раскрашиваю их, однако возникает ошибка с проводной настройкой.

Это пример ошибки: в начале все нормально окрашиваетсявведите описание изображения здесь

Это происходит после:

введите описание изображения здесь

Это странно, потому что мой лексер работает нормально, это вывод на консоль:

     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='}'}
  

Теперь, чтобы вы поняли, синий цвет предназначен для имен, как на первом рисунке, белый для ключевых слов и знаков, проблема в том, что после ввода в течение некоторого времени все начинает окрашиваться в синий цвет, в то время как токены являются правильными.

Это код для раскраски и загрузки токенов:

     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;
    }
  

При необходимости я могу предоставить код лексера, но, как указано выше, токены в порядке, окрашивание — это то, что проблематично.

РЕДАКТИРОВАТЬ: если кто-то знает лучшие способы раскраски / тематизации кода, было бы здорово, если бы вы могли предоставить некоторый пример кода и объяснение того, как это работает.

Ответ №1:

Попробуйте использовать textprocessor, чтобы вам не приходилось реализовывать это самостоятельно, вы даже можете обучить его для своего собственного языка