有线着色问题 Android EditText
Wired coloring issue 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;
}
如果需要我可以提供词法分析器代码,但如上所述,标记没问题,着色是有问题的。
编辑:
如果有人知道 coloring/theming 代码的更好方法,那么如果您能提供一些示例代码并解释其工作原理,那就太好了。
尝试使用文本处理器,这样你就不必自己实现它,你甚至可以为你自己的语言训练它
我需要在 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;
}
如果需要我可以提供词法分析器代码,但如上所述,标记没问题,着色是有问题的。
编辑: 如果有人知道 coloring/theming 代码的更好方法,那么如果您能提供一些示例代码并解释其工作原理,那就太好了。
尝试使用文本处理器,这样你就不必自己实现它,你甚至可以为你自己的语言训练它