基本上我有这样一段
导带下能级$ec 和价带上能级$ev之间的差称为能带隙。
现在我正在尝试解析文本,以获取那些以 $ 为前缀的符号,并将它们替换为作为数学公式的小型 PNG 图像。它们只是像 Ev 和 Ec 这样的单/dbl 字母常量符号。它们在我的资产文件夹中。基本上这是代码
public SpannableStringBuilder getConstants(String desc, String constpath){
SpannableStringBuilder builder = new SpannableStringBuilder();
if (desc.contains("$")){
Matcher matcher = Pattern.compile("\\$\\w+").matcher(desc);
int lastEnding=0;
while (matcher.find()) {
String constName = matcher.group();
constName = constName.substring(1,constName.length());
int startIndex = matcher.start();
int endIndex = matcher.end();
String brokenDescFirstPart = desc.substring(lastEnding, startIndex - 1);
lastEnding = endIndex+1;
builder.append(brokenDescFirstPart).append(" ");
try{
InputStream imgStream = getContext().getAssets().open(constpath+constName+".png");
Drawable dconstImg = Drawable.createFromStream(imgStream, null);
imgStream.close();
builder.setSpan(new ImageSpan(dconstImg,ImageSpan.ALIGN_BOTTOM), builder.length() -3, builder.length() -1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.append(" ");
}catch (Exception e){
builder.append(" ");
}
}
String brokenDescLastPart = desc.substring(lastEnding, desc.length() - 1);
builder.append(brokenDescLastPart);
}else{
builder = SpannableStringBuilder.valueOf(desc);
}
return builder;
}
代码的快速总结是desc是我要解析的字符串。然后我使用正则表达式获取 $word 模式并使用matcher.match方法遍历文本。我使用一些 int 变量来跟踪这些符号之间的起点和终点,以仔细重建嵌入图像的原始字符串。现在代码
try{
InputStream imgStream = getContext().getAssets().open(constpath+constName+".png");
Drawable dconstImg = Drawable.createFromStream(imgStream, null);
imgStream.close();
builder.setSpan(new ImageSpan(dconstImg,ImageSpan.ALIGN_BOTTOM), builder.length() -3, builder.length() -1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.append(" ");
}catch (Exception e){
builder.append(" ");
}
是我问题的症结所在。我是从关于这个问题的其他一些问题中得到的。他们说它有效。但它不在我的范围内。我已经在整个代码中设置了断点并逐行执行。没有任何错误。还是不行。
文本在文本视图中加载了额外的空格,我有意使用这些空格来识别它必须注入图像的位置。我的 TextView 是 Android Studio 中的小文本视图小部件。