Android 中使用 Span 的文本样式
所有这些类都扩展了Spanned接口。 SpannableString和SpannableStringBuilder也扩展了Spannable接口。为了使用跨度,我们需要在Spannable对象上调用setSpan(Object spans, int start, int end, int flag) 。对象跨度参数是指应用于文本的跨度,开始和结束是指要应用跨度的文本位置的索引。
在应用跨度时,如果插入的文本在跨度边界内,那么跨度会自动扩展插入的文本如果插入的文本在开始和结束索引之间 - 标志参数将决定跨度应该包括还是排除插入的文本。
- Spannable.SPAN_EXCLUSIVE_INCLUSIVE – 包括插入的文本
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE – 排除插入的文本。
例子
在此示例中,我们将通过使用 SpannableString 类以及 StyleSpan、UnderlineSpan 和 StrikethroughSpan 来更改文本的样式。下面给出了一个示例图像,以了解我们将在本文中做什么。请注意,我们将使用Java语言来实现这个项目。
分步实施
第 1 步:创建一个新项目
要在 Android Studio 中创建新项目,请参阅如何在 Android Studio 中创建/启动新项目。请注意,选择Java作为编程语言。
步骤 2:使用 activity_main.xml 文件
在布局文件中,我们将有一个 TextView。我们将使用跨度设置此文本的样式。下面是activity_main.xml 文件的代码片段。
XML
Java
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.text.style.UnderlineSpan;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Referencing the TextView
TextView textView = (TextView) findViewById(R.id.textView);
// The text that need to be styled using spans
String text = "I want Red and Green to be colored and these to be Bold, Italic and Underline and Strike-through";
// This will convert the text-string to spannable string
// and we will used this spannableString to put spans on
// them and make the sub-string changes
SpannableString spannableString = new SpannableString(text);
// Creating the spans to style the string
ForegroundColorSpan foregroundColorSpanRed = new ForegroundColorSpan(Color.RED);
ForegroundColorSpan foregroundColorSpanGreen = new ForegroundColorSpan(Color.GREEN);
StyleSpan boldSpan = new StyleSpan(Typeface.BOLD);
StyleSpan italicSpan = new StyleSpan(Typeface.ITALIC);
UnderlineSpan underlineSpan = new UnderlineSpan();
StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
// Setting the spans on spannable string
spannableString.setSpan(foregroundColorSpanRed, 7, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(foregroundColorSpanGreen, 15, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(boldSpan, 51, 55, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(italicSpan, 57, 63, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(underlineSpan, 68, 77, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(strikethroughSpan, 82, 96, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// Setting the spannable string on TextView
textView.setText(spannableString);
}
}
第 3 步:使用 MainActivity。Java
在主活动中。 Java文件,我们首先定义一个需要样式化的字符串。一旦我们定义了字符串,我们就将其转换为可跨度字符串,然后我们定义所有需要修改的跨度,然后我们将这些跨度设置为可跨度字符串,最后将可跨度字符串设置为 TextView。下面是MainActivity 的代码。 Java文件。代码中添加了注释以更详细地理解代码。
Java
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.text.style.UnderlineSpan;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Referencing the TextView
TextView textView = (TextView) findViewById(R.id.textView);
// The text that need to be styled using spans
String text = "I want Red and Green to be colored and these to be Bold, Italic and Underline and Strike-through";
// This will convert the text-string to spannable string
// and we will used this spannableString to put spans on
// them and make the sub-string changes
SpannableString spannableString = new SpannableString(text);
// Creating the spans to style the string
ForegroundColorSpan foregroundColorSpanRed = new ForegroundColorSpan(Color.RED);
ForegroundColorSpan foregroundColorSpanGreen = new ForegroundColorSpan(Color.GREEN);
StyleSpan boldSpan = new StyleSpan(Typeface.BOLD);
StyleSpan italicSpan = new StyleSpan(Typeface.ITALIC);
UnderlineSpan underlineSpan = new UnderlineSpan();
StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
// Setting the spans on spannable string
spannableString.setSpan(foregroundColorSpanRed, 7, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(foregroundColorSpanGreen, 15, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(boldSpan, 51, 55, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(italicSpan, 57, 63, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(underlineSpan, 68, 77, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(strikethroughSpan, 82, 96, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// Setting the spannable string on TextView
textView.setText(spannableString);
}
}