我有以下要求:
i> 用户在EditText中输入字符串。
例如:aaaaaabbbbbbbbcccccccccc
ii>用户现在选择子字符串"bbbbbbb"并为子字符串添加粗体样式。
子字符串的选择使用以下代码完成:
EditText content = (EditText) layout
.findViewById(R.id.txt_content);
int startSelection = content.getSelectionStart();
int endSelection = content.getSelectionEnd();
现在,将粗体样式应用于子字符串,添加了以下代码以反映EditText上的样式:
final SpannableStringBuilder str1 = new SpannableStringBuilder(content.getText().toString());
str1.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), startSelection, endSelection, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
content.setText(str1);
ii>现在用户修改原始字符串。假设新字符串为
例如:aaaaaa bbbbbbbbb ccccccccc ddddddddd
现在用户想要在子字符串"ddddddddd"上应用下划线样式现在,在下划线之前,使用以下代码从EditText中提取当前文本:content.getText()
问题是使用content.getText()提取的文本不包含已应用于子字符串"bbbbbbb"的BOLD样式。
基本上,要求是通过选择对句子中的各个字符/单词应用不同的风格(粗体/斜体)。句子的修改(添加/删除字符/单词)也是可能的
如何解决问题?
EditText content = (EditText) layout.findViewById(R.id.txt_content);
int startSelection = content.getSelectionStart();
int endSelection = content.getSelectionEnd();
// important. dont use getText()
Spannable sb = new SpannableString( content.toString() );
/** for bold for example. substract the endselection from startselection to get the length **/
sb.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), startSelection, endSelection - startSelection, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //bold
/** do more styles ...**/
sb.setSpan(new UnderlineSpan(), 20, 30, 0);
content.setText(sb);
在TextView 中显示
textview.setText(sb);
您还可以使用获取所有指定样式
StyleSpan[] mSpans = content.getText().getSpans(0, content.length(), StyleSpan.class);
并通过检查课堂来阅读不同的风格。
for (StyleSpan mSpan : mSpans) {
if (mSpan instanceof StyleSpan) {
int start = content.getSpanStart(mSpan);
int end = content.getSpanEnd(mSpan);
int flag = content.getSpanFlags(mSpan);
Log.i("SpannableString Spans", "Found StyleSpan at:n" +
"Start: " + start +
"n End: " + end +
"n Flag(s): " + flag);
}
}
您知道,如果不追加文本,则不必使用SpanableStringBuilder,您可以使用Spanable文本。无论如何,我认为你的问题是你把文本转换成字符串。
Spannable spannable = new SpannableString(mEditText.getText());
spannable.setSpan(new StyleSpan(Typeface.BOLD),
mEditText.getSelectionStart(),
mEditText.getSelectionEnd(),
Spannable.SPAN_INCLUSIVE_INCLUSIVE);
mEditText.setText(spannable);
但是,如果您的代码要重叠样式,您将不得不以不同的方式处理它。