首页 > 其他分享 >Android - 使用SpannableString设置复合文本

Android - 使用SpannableString设置复合文本

时间:2022-11-11 15:39:11浏览次数:50  
标签:EXCLUSIVE SPAN spannableString new Android 文本 SpannableString


TextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式、事件方面的设置。Android系统通过SpannableString类来对指定文本进行相关处理,具体有以下功能:

1、BackgroundColorSpan 背景色 
2、ClickableSpan 文本可点击,有点击事件
3、ForegroundColorSpan 文本颜色(前景色)
4、MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
5、MetricAffectingSpan 父类,一般不用
6、RasterizerSpan 光栅效果
7、StrikethroughSpan 删除线(中划线)
8、SuggestionSpan 相当于占位符
9、UnderlineSpan 下划线
10、AbsoluteSizeSpan 绝对大小(文本字体)
11、DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。
12、ImageSpan 图片
13、RelativeSizeSpan 相对大小(文本字体)
14、ReplacementSpan 父类,一般不用
15、ScaleXSpan 基于x轴缩放
16、StyleSpan 字体样式:粗体、斜体等
17、SubscriptSpan 下标(数学公式会用到)
18、SuperscriptSpan 上标(数学公式会用到)
19、TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
20、TypefaceSpan 文本字体
21、URLSpan 文本超链接


可以通过一个小实例了解一下上面方法的用法,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>

MainActivity.java代码如下:


public class MainActivity extends AppCompatActivity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.textView);
mTextView.setText(getString());
//设置超链接可点击
mTextView.setMovementMethod(LinkMovementMethod.getInstance());
}
private SpannableString getString() {
final SpannableString spannableString = new SpannableString(
"这是测试字符串,百度地址如下:http://www.baidu.com");
//BackgroundColorSpan设置背景颜色为绿色
spannableString.setSpan(new BackgroundColorSpan(Color.GREEN),
15, spannableString.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
//UnderlineSpan设置下划线
spannableString.setSpan(new UnderlineSpan(),
15, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置可点击的单击事件监听
spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Intent it = new Intent(Intent.ACTION_VIEW,
Uri.parse(spannableString.subSequence(15,
spannableString.length()).toString()));
it.setClassName("com.android.browser",
"com.android.browser.BrowserActivity");
MainActivity.this.startActivity(it);
}
}, 15, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannableString;
}
}

setSpan方法需要传入几个参数:

  • 第一个是处理的方法,也就是上面介绍的一些方法;
  • 第二个是起始位置;
  • 第三个是结束位置;
  • 第四个是标志位,这里主要有如下几种:

 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)、Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括)、Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括)、Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括)

运行实例如下:

Android - 使用SpannableString设置复合文本_android

这里我们设置了下划线,并对这部分文字引入了ClickSpan对象,也就是文字可点击,里面覆写了onClick方法,在这个方法中处理了URL的打开逻辑,除了这个方法,系统还提供了URLSpan 对象,同样可以实现URL跳转如下:

private SpannableString getUrl(){
SpannableString spannableString;
spannableString = new SpannableString("URLSpan -- 亚运的博客");
spannableString.setSpan(new URLSp
10, spannableString.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
return spannableString;
}

可以查看一下URLSpan的源码如下:


@Override
public void onClick(View widget) {
Uri uri = Uri.parse(getURL());
Context context = widget.getContext();
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
try {
context.startActivity(intent);
} catch (ActivityNotFoundException e) {
Log.w("URLSpan", "Actvity was not found for intent, " + intent.toString());
}
}

内部实现了onClick单击事件,通过getURL方法获取对象初始化时传入的URL,也就是:      

然后通过Intent跳转到浏览器显示,运行如下:

Android - 使用SpannableString设置复合文本_SpannableString_02

除了对文字进行处理之外,还可以引入图片,看下面的方法:


private SpannableString getString2() {
SpannableString spannableString = new SpannableString("这是测试字符串,这是测试字符串");
DynamicDrawableSpan drawableSpan =
new DynamicDrawableSpan(DynamicDrawableSpan.ALIGN_BASELINE) {
@Override
public Drawable getDrawable() {
Drawable d = getResources().getDrawable(R.mipmap.ic_launcher);
d.setBounds(0, 0, 50, 50);
return d;
}
};
DynamicDrawableSpan drawableSpan2 = new DynamicDrawableSpan(
DynamicDrawableSpan.ALIGN_BOTTOM) {
@Override
public Drawable getDrawable() {
Drawable d = getResources().getDrawable(R.mipmap.ic_launcher);
d.setBounds(0, 0, 50, 50);
return d;
}
};
spannableString.setSpan(drawableSpan, 3, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(drawableSpan2, 7, 8, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
return spannableString;
}

DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。创建第一个DynamicDrawableSpan 对象的时候传入的参数确定了是基于文本基线对齐。同时创建这个对象的时候构造了一个匿名内部类。这个方法里面首先获取一个Drawable对象,调用了其setBounds方法,需要传入四个参数:(int left, int top, int right, int bottom),这个四参数指的是drawable将在被绘制在canvas的哪个矩形区域内。

第二个DynamicDrawableSpan 对象采用的是基于底部对齐,运行实例看一下效果如下:

Android - 使用SpannableString设置复合文本_android_03


       这里就演示这几个方法,其余方法的代码可以自行测试。

谢谢关注我的微信公众号,觉得好可以分享到朋友圈哦.

Android - 使用SpannableString设置复合文本_下划线_04


标签:EXCLUSIVE,SPAN,spannableString,new,Android,文本,SpannableString
From: https://blog.51cto.com/u_15866446/5845009

相关文章

  • android属性之clearTaskOnLaunch
    clearTaskOnLaunch有没有这样的需求,每次从桌面进入都启动根Activity?可以使用这个属性实现哦,下面通过一个实例来看一下效果:1.MainActivity.java(根Activity):packagecom.examp......
  • Android实战简易教程-第二十枪(GridView长按显示删除)
    用过UC浏览器的都使用过如下功能:长按图标会弹出删除的图标,我们下面研究一下如何实现类似效果。1.配置main.xml文件:<RelativeLayoutxmlns:android="http://schemas.android.......
  • Android开发技巧四--圆角化控件,让它看起来更美
    当需要为应用程序UI控件选择背景的时候,开发者会添加自定义的颜色和形状来代替系统的默认样式,圆角边框看起来是很不错的效果,开发者只需要添加几行代码,就可以在应用程序中使用......
  • Android clean后出现很多错误解决办法
    当我们从别的项目中拷入一个布局文件进我们的项目时,可能出现在activity中无法找到控件的情况,这时如果你clean了一下项目,就会出现很多报错,这是由于在项目有错误的情况下clean......
  • Android实战简易教程-第二十一枪(GridView动态添加Item)
    本例子实现在GridView的最后显示一个增加图片,点击图片动态增加内容item。1.main.xml:<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xml......
  • Android实战简易教程-第二十五枪(基于Baas的数据表查询下拉刷新和上拉加载实现!)
    上一节我们实现了数据表的加载,但是,当数据表数据很多时,我们就要考虑数据的分页,这里我们选用了PullToRefreshListView控件,先看一下该控件的说明:效果图:        ......
  • 关于MacBook怎么更新Android SDK
    昨天公司的人给了我一个VPN,但是还是无法更新SDK,后来发现将下图:通过VPN发送所有流量勾选以后就可以连接更新了,哎,处处皆学问,特此分享一下此经验。喜欢的朋友关注我哦!多谢支持......
  • Android 找不到资源文件错误的解决办法
    有些时候我们明明在layout文件夹下面配置了布局文件,但是在activity中却报错,提示找不到该文件。解决办法:这是因为你导入的R包不对,将activity文件import中后缀为.R的一行删除,......
  • 百度富文本编辑器UEditor配置及功能实现详解
    ​ 当前功能基于PHP,其它语言流程大抵相同。大概流程:1.将docx文件上传到服务器中2.使用PHPoffice/PHPword实现将word转换为HTML3.将HTML代码返回并赋值到编辑器中......
  • Android studio 日志输出
      Log.v("Tag","Msg");//Verbose观察值,Verbose是冗长、啰嗦的意思,任何消息都会输出Log.d("Tag","Msg");//Debug调试Log.i("Tag","Msg");//Info信息,为一般提示......