在运行时更改EditText中的文本样式格式



我有以下要求:

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

但是,如果您的代码要重叠样式,您将不得不以不同的方式处理它。

最新更新