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

Inn*_*ler 12 storage android background-color spannable

我正在尝试将BackgroundColorSpan设置为我的编辑文本中的选定文本.因此,当我选择任何文本并单击按钮时,它会将背景颜色设置为该特定文本,然后我将该注释保存到我的带有.html格式的SD卡中,然后我再次检索该注释以便以相同的格式再次编辑.

我现在面临的问题是当我将BackgroundColorSpan应用于所选文本时,它显示的是我应用的背景颜色的字符串,但是一旦我将该注释保存到我的SD卡并重新打开,它就不会显示该特定字符串的背景颜色它显示我没有背景颜色的正常字符串.

下面是我用来将背景颜色设置为编辑文本选定区域的代码

mSpannable.setSpan(new BackgroundColorSpan(color),startSelection, endSelection, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Run Code Online (Sandbox Code Playgroud)

以下是将我的笔记保存到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();
Run Code Online (Sandbox Code Playgroud)

使用上面的代码我成功地能够以HTML格式保存我的文件,但我没有得到背景颜色的字符串.

我试图在日志中打印该字符串然后在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>
Run Code Online (Sandbox Code Playgroud)

你可以在这里尝试这个字符串, 它给出了完美的结果,背景颜色为字符串,但设置为android Edit-ext我不知道发生了什么,它不是像我期望的那样设置.

编辑

下面是我用来从SDcard文件中检索文本的代码

            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);
Run Code Online (Sandbox Code Playgroud)

Smi*_*tel 6

在创建保存HTML注释的项目时遇到的同样问题.

正如你所说,你已经制作了自定义的HTML.java类,我也为我的目的定制了同一个类.

默认的Html.java类不包含backgroundcolor,字体大小,项目符号等功能.

所以我在这里分享该课程的内容,以便您可以从中获取想法,将背景颜色设置为HTML Note.

让我们假设您定制的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("\">");
            }
Run Code Online (Sandbox Code Playgroud)

然后完成您已开始的字体样式

if (style[j] instanceof BackgroundColorSpan) {
                out.append("</font>");
            }
Run Code Online (Sandbox Code Playgroud)

2)这是我的Font

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

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

            }
        }

    }
}
Run Code Online (Sandbox Code Playgroud)