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

标签 android

我有以下要求:

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

例如:aaaaaaa bbbbbbbbb ccccccccccccc

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

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

EditText content = (EditText) layout
            .findViewById(R.id.txt_content);
int startSelection = content.getSelectionStart();
int endSelection = content.getSelectionEnd();

现在,将粗体样式应用于子字符串,添加以下代码以反射(reflect) 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> 现在用户修改了原始字符串。 让我们假设新字符串是

例如:aaaaaaa bbbbbbbbb ccccccccccccc dddddddd

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

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

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

如何解决问题?

最佳答案

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

关于android - 在运行时更改 EditText 中的文本样式格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28898722/

相关文章:

java - 在 Android Studio 中膨胀类 EditText 时出错

android - 如何使用列表适配器在回收器 View 中修改列表?

android - Xamarin 函数错误

自定义 ArrayAdapter 中的 Android getSystemService

java - 修复找不到符号 mInterstitialAd = new InterstitialAd(this);符号 : variable mInterstitialAd location: class Ads

android - 当网络关闭并重新打开时,FFmpegMediaPlayer 停止

java - Android 中的 HTML 似乎不起作用

java - Fragment 中的 findViewById 返回 Null

android - session Cookie 在 Retrofit Android 中不持久

android - Android 屏幕关闭时识别音量按钮按下