保存spannable字符串?

时间:2017-11-07 16:02:09

标签: java android xml

我正在创建一个笔记应用程序而且我几乎已经完成了,我只是遇到了一个问题,我遇到了一个问题:我想要实现的目标是什么?我键入一个音符,然后单击一个按钮,我希望它在edittext字段中添加一个大的粗体字符串,这是在spannable字符串的帮助下实现的。我现在的问题是当我保存笔记然后退出,然后回到笔记中,spannable字符串仍然存在但不再是大而粗体:/有没有办法保存spannable字符串?如果没有,有没有办法达到同样的效果?另外注意:我想知道是否有一种方法可以使spannable字符串的文本成为一个对象。所以当我擦掉它时,它会一起消除。不是每个字母都像普通文字。谢谢先进,我非常感谢任何见解:D

继承了我的NoteActivity中的按钮

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.save_note:
            save_note();
            return true;
        case android.R.id.home:
            save_note();
            finish();
            return true;

        case R.id.add_intro:
            SpannableString intro;
            if (note_content.length() == 0) {
                intro = new SpannableString("(Intro:)\n");
                intro.setSpan(new StyleSpan(Typeface.BOLD), 0, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                intro.setSpan(new RelativeSizeSpan(1.25f), 0, 8, 0);
            } else {
                intro = new SpannableString("\n\n(Intro:)\n");
                intro.setSpan(new StyleSpan(Typeface.BOLD), 0, 11, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                intro.setSpan(new RelativeSizeSpan(1.25f), 0, 11, 0);
            }
            note_content.append(intro);
            return true;

以及如何保存和加载笔记 应用

public class Utilities {

public static final String FileExtention = ".bin";

public static boolean save_note(Context context, Note note) {

    String fileName = String.valueOf(note.getDateTime()) + FileExtention;

    FileOutputStream fos;
    ObjectOutputStream oos;

    try {
        fos = context.openFileOutput(fileName, context.MODE_PRIVATE);
        oos = new ObjectOutputStream(fos);
        oos.writeObject(note);
        oos.close();
        fos.close();

    } catch (IOException e) {
        e.printStackTrace();
        return false;

    }


    return true;
}

public static ArrayList<Note> getAllSavedNotes(Context context) {
    ArrayList<Note> notes = new ArrayList<>();

    File filesDir = context.getFilesDir();
    ArrayList<String> noteFiles = new ArrayList();

    for(String file : filesDir.list()) {
        if(file.endsWith(FileExtention)) {
            noteFiles.add(file);
        }
    }

    FileInputStream fis;
    ObjectInputStream ois;

    for(int i = 0; i < noteFiles.size(); i++) {
        try{
            fis = context.openFileInput(noteFiles.get(i));
            ois = new ObjectInputStream(fis);

            notes.add((Note)ois.readObject());

            fis.close();
            ois.close();

        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }

    return notes;
}

继承NoteAdapter

public class NoteAdapter extends ArrayAdapter<Note> {

public NoteAdapter(Context context, int resource, ArrayList<Note> notes) {
    super(context, resource, notes);


}

@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
    //return super.getView(position, convertView, parent);

    if(convertView == null) {
        convertView = LayoutInflater.from(getContext())
                .inflate(R.layout.item_note, null);
    }

    Note note = getItem(position);

    if(note != null) {
        TextView title = (TextView) convertView.findViewById(R.id.list_note_title);
        TextView content = (TextView) convertView.findViewById(R.id.list_note_content);
        TextView date = (TextView) convertView.findViewById(R.id.list_note_date);

        Typeface music_font = Typeface.createFromAsset(getContext().getAssets(), "fonts/melodymakernotesonly.ttf");
        Typeface scribble_card = Typeface.createFromAsset(getContext().getAssets(), "fonts/the unseen.ttf");
        title.setTypeface(music_font);
        content.setTypeface(scribble_card);

        title.setText(note.getTitle());
        date.setText(note.getDateTimeFormatted(getContext()));

        if(note.getContent().length() > 25) {
            content.setText(note.getContent().substring(0,25) + "...");
        } else {
            content.setText(note.getContent());
        }

        if(note.getContent().length() <= 0) {
            content.setText("(Empty Note..)");
        } else {
            content.setText(note.getContent());
        }

        if (note.getTitle().length() <= 0) {
            title.setText("(Untitled)");
        } else {
            title.setText(note.getTitle());
        }
    }

    return convertView;
}

这里是我的Note类

public class Note implements Serializable {

private long mDateTime;
private String mTitle;
private String mContent;

public Note(long dateTime, String title, String content) {
    mContent = content;
    mTitle = title;
    mDateTime = dateTime;
}

public void setDateTime(long dateTime) {
    mDateTime = dateTime;
}

public void setTitle(String title) {
    mTitle = title;
}

public void setContent(String content) {
    mContent = content;
}

public long getDateTime() {
    return mDateTime;
}

public String getTitle() {
    return mTitle;
}

public String getContent() {
    return mContent;
}

public String getDateTimeFormatted(Context context) {
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:SS", context.getResources().getConfiguration().locale);
    sdf.setTimeZone(TimeZone.getDefault());
    return sdf.format(new Date(mDateTime));
}

任何想法?

1 个答案:

答案 0 :(得分:2)

SpannableString转换为正常String(与您的Note.mContent一样)时,距离信息会丢失。 SpannableString使用的跨度与HTML标记完全不同。您可以将它们视为实际字符串的附加信息。

让我们拿这个字符串:

  

嗨,我是粗体字符串。

在SO上使用的降价中,看起来像这样:

Hi, I am a **bold** string.

在HTML中看起来像这样:

Hi, I am a <strong>bold</strong> string.

然而,因为SpannableString是这样的结构:

Text : Hi, I am a bold string. Span : Render characters [11..14] in bold

因此,有实际的文本和附加信息,文本的哪些部分以粗体显示。

如果您想保留该信息,可以使用基本HTML支持,Android提供并使用"Hi, I am a <b>bold</b> string."之类的字符串,或者您必须另外将格式信息保存到文本内容中。

修改

要使用带HTML的字符串,您必须使用Html.fromHtml()

textView.setText(Html.fromHtml(getString(R.string.your_html_string)));

保存格式信息意味着您必须扩展Note类以存储格式信息,基本上是您应用于字符串的范围。例如,您可以使用以下内容:

class FormatInfo {
    int from;
    int to;
    int formatCode; // <-- e.g. 1 = bold, 2 = italic etc. 
} 

class FormattedNote extends Note {
    List<FormatInfo> formatInfos = new ArrayList<>();

}

然后,您必须转换应用于FormatInfo对象的跨度并在保存注释时将它们添加到FormattedNote,再次创建SpannableString时,您必须从formatInfos创建跨距说明。