我正在尝试将 BackgroundColorSpan 设置为我的 Edit-text 中的选定文本。因此,当我选择任何文本并单击按钮时,它会将背景颜色设置为该特定文本,然后我将该注释保存到我的 SDCard 中,格式为 .html 然后我再次检索该注释以进行编辑再次以相同的格式。
我现在面临的问题是,当我将 BackgroundColorSpan 应用于所选文本时,它显示的是我应用的具有背景颜色的字符串,但是一旦我将该注释保存到我的 SDCard 并重新打开,它不显示该特定字符串的背景颜色,而是显示没有背景颜色的普通字符串。
下面是我用来将背景颜色设置为编辑文本选定区域的代码
mSpannable.setSpan(new BackgroundColorSpan(color),startSelection, endSelection, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
下面是将我的笔记保存到 SD 卡的代码。
Spanned spannedText = edtNoteDescription.getText();
StringBuilder output = new StringBuilder();
AppHtml.withinHtml(output, spannedText);
File mFile = new File(Environment.getExternalStorageDirectory()
+ File.separator + "MyNote/");
}
File myFile = new File(mFile, "/" + strNoteTitle + ".html/");
myFile.createNewFile();
FileOutputStream fOut = new FileOutputStream(myFile);
OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
myOutWriter.append(output);
myOutWriter.close();
fOut.close();
使用上面的代码,我可以成功地以 HTML 格式保存我的文件,但我没有得到具有背景颜色的字符串。
我尝试在 Log 中打印该字符串,然后将该字符串粘贴到 w3School 中,然后我得到了我期望的准确结果,但在 android 中我不知道为什么它不起作用。
我在 Logcat 中得到的字符串如下
<p><font color ="#7dff00">This</font> <font color ="#ff5100">Is</font>  a  <font color ="#04ff00"><b><font style = "background-color:#2929dd">String</font></b></font>... </p>
你可以试试这个字符串 here这为字符串提供了背景颜色的完美结果,但在设置为 android Edit-ext 时,我不知道发生了什么,而且它没有按照我预期的那样设置。
编辑
下面是我用来从我的 SD 卡文件中检索文本的代码
Bundle bundle = getIntent().getExtras();
strGetPath = bundle.getString(GlobalClass.notesPath);
filePath = new File(strGetPath);
fileInputStream = new FileInputStream(filePath);
int size = fileInputStream.available();
bytbuffer = new byte[size];
fileInputStream.read(bytbuffer);
fileInputStream.close();
String strGetData = new String(bytbuffer);
Spanned spanHTMLData = AppHtml.fromHtml(strGetData);
LogM.e("===== Getting Data =====" + strGetData);
edtNoteDescription.setText(spanHTMLData);
最佳答案
我在创建一个保存 HTML 笔记的项目时遇到了同样的问题。
正如您所说,您已经制作了自定义的 HTML.java 类,我也为我的目的自定义了相同的类。
默认的 Html.java 类不包含背景颜色、字体大小、项目符号等功能
所以我在这里分享该类(class)的内容,这样您就可以从中得到为您的 HTML 注释设置背景颜色的想法。
让我们假设您自定义的 Html.java = AppHtml.java,以便其他人可以更好地理解它。
1) 首先在您的 AppHtml.java 类中添加背景色标签。将以下代码添加到您的 withinParagraph 方法。
if (style[j] instanceof BackgroundColorSpan) {
out.append("<font style = \"background-color:#");
String color = Integer
.toHexString(((BackgroundColorSpan) style[j])
.getBackgroundColor() + 0x01000000);
while (color.length() < 6) {
color = "0" + color;
}
out.append(color);
out.append("\">");
}
然后完成你已经开始的字体样式
if (style[j] instanceof BackgroundColorSpan) {
out.append("</font>");
}
2) 这是我的字体类
private static class Font {
public String mColor;
public String mFace;
public String mbgColor;
public String mSize;
public Font(String color, String face, String bgColor, String size) {
mColor = color;
mFace = face;
mbgColor = bgColor;
mSize = size;
}
}
3)这是我的startFont方法。
private static void startFont(SpannableStringBuilder text,
Attributes attributes) {
String color = attributes.getValue("", "color");
String face = attributes.getValue("", "face");
String bgColor = attributes.getValue("", "style");
String size = attributes.getValue("", "size");
int len = text.length();
text.setSpan(new Font(color, face, bgColor, size), len, len,
Spannable.SPAN_MARK_MARK);
}
4)这是我的endFont方法。
private static void endFont(SpannableStringBuilder text) {
int len = text.length();
Object obj = getLast(text, Font.class);
int where = text.getSpanStart(obj);
text.removeSpan(obj);
if (where != len) {
Font f = (Font) obj;
if (f.mColor != null) {
if (!TextUtils.isEmpty(f.mColor)) {
if (f.mColor.startsWith("@")) {
Resources res = Resources.getSystem();
String name = f.mColor.substring(1);
int colorRes = res.getIdentifier(name, "color",
"android");
if (colorRes != 0) {
ColorStateList colors = res
.getColorStateList(colorRes);
text.setSpan(new TextAppearanceSpan(null, 0, 0,
colors, null), where, len,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
} else {
int c = getHtmlColor(f.mColor);
if (c != -1) {
text.setSpan(
new ForegroundColorSpan(c | 0xFF000000),
where, len,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
}
if (f.mFace != null) {
text.setSpan(new TypefaceSpan(f.mFace), where, len,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
if (f.mbgColor != null) {
String bg_COLOR = f.mbgColor.substring(
f.mbgColor.lastIndexOf("#"), f.mbgColor.length());
if (!TextUtils.isEmpty(bg_COLOR)) {
if (bg_COLOR.startsWith("@")) {
Resources res = Resources.getSystem();
String name = bg_COLOR.substring(1);
int colorRes = res.getIdentifier(name, "color",
"android");
if (colorRes != 0) {
ColorStateList colors = res
.getColorStateList(colorRes);
text.setSpan(new TextAppearanceSpan(null, 0, 0,
colors, null), where, len,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
} else {
int c = getHtmlColor(bg_COLOR);
if (c != -1) {
text.setSpan(
new BackgroundColorSpan(c | 0xFF000000),
where, len,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
}
if (f.mSize != null) {
if (!TextUtils.isEmpty(f.mSize)) {
int size = Integer.parseInt(f.mSize);
text.setSpan((new AbsoluteSizeSpan(size)), where, len,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
}
关于android - 如何在android中检索选定文本的BackgroundColorSpan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25723828/