android - 如何在android中检索选定文本的BackgroundColorSpan

标签 android storage background-color spannable

我正在尝试将 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>&#160; a&#160; <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/

相关文章:

javascript - 访问样式背景颜色

android - 防止触摸屏幕时出现android状态栏

database - 如何将图像直方图存储到数据库中并能够进行搜索

来自树 URI 的 Android 5.0 DocumentFile

android - 如何从内部存储中读取 .gif 文件?

CSS:背景图像不透明的背景颜色

java - 从浅绿到暗红流动

android - View.OnKeyListener 为我的 Activity 工作过一次,不再工作

java - 在 SharedPreferences 中保存字符串集的最快方法是什么?

android - 视频播放器上的模糊面板