我正在创建一个笔记应用程序而且我几乎已经完成了,我只是遇到了一个问题,我遇到了一个问题:我想要实现的目标是什么?我键入一个音符,然后单击一个按钮,我希望它在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));
}
任何想法?
答案 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创建跨距说明。