【问题标题】:Change Text style format in EditText at runtime在运行时更改 EditText 中的文本样式格式
【发布时间】:2015-05-08 01:18:10
【问题描述】:

我有以下要求:

i> 用户在 EditText 中输入一个字符串。

例如:aaaaaa bbbbbbbbb ccccccccccccc

ii> 用户现在选择子字符串“bbbbbbbbb”并为子字符串添加粗体样式。

使用以下代码选择子字符串:

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

iii> 现在用户修改原始字符串。 让我们假设新字符串是

例如:aaaaaa bbbbbbbbb ccccccccccccc dddddddddd

现在用户想要在子字符串“ddddddddd”上应用下划线样式 现在,在 underline 之前,使用以下代码从 EditText 获取当前文本: content.getText()

问题是使用 content.getText() 获取的文本不包含已应用于子字符串“bbbbbbbbb”的 BOLD 样式。

基本上要求是通过选择对句子中的单个字符/单词应用不同的样式(粗体/斜体)。句子的修改(添加/删除字符/单词)也是可能的。

如何解决问题?

【问题讨论】:

    标签: android


    【解决方案1】:
     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);
        }
    }    
    

    【讨论】:

      【解决方案2】:

      您知道,如果您不附加文本,则不必使用 SpannableStringBuilder,您可以使用 Spannable 文本。无论如何,我认为您的问题是您将文本转换为字符串。

      Spannable spannable = new SpannableString(mEditText.getText());
      spannable.setSpan(new StyleSpan(Typeface.BOLD),
                          mEditText.getSelectionStart(),
                          mEditText.getSelectionEnd(),
                          Spannable.SPAN_INCLUSIVE_INCLUSIVE);
      
      mEditText.setText(spannable);
      

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

      【讨论】:

      • 非常感谢您的回答。如何在这个 SpannableString 中设置文本大小?我想根据选择为我的 EditText 的不同子字符串设置不同的字体大小。
      • 有一个“RelativeSizeSpan”类,但我自己没有使用过。您可以将其设置为跨度。
      猜你喜欢
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 2018-10-09
      • 2021-08-09
      相关资源
      最近更新 更多