如何将SpannableString转为String且不丢失标记属性,实现Toast正常显示?
嘿,这个问题我之前做项目时也碰到过,咱们来好好捋一捋~
为啥转成String就没效果了?
首先得搞清楚:SpannableString的背景色这类样式,是存在它内部的Span标记结构里的,而调用toString()方法只会提取它的纯文本内容,所有的样式信息会直接被丢掉。所以转成String后,Toast拿到的就是个普通文本,自然没法显示红色背景啦。
可行的解决方案
如果你不想直接在Toast里传入SpannableString,可以试试下面两种方法:
方法1:自定义Toast布局
自己写一个带TextView的布局,直接给TextView设置背景色和文本,用自定义Toast来显示:
// 先创建自定义布局文件(比如res/layout/toast_custom.xml) <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/toast_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#ff0000" android:textColor="#ffffff" android:padding="8dp" android:text="My string"/> // 然后在代码里加载布局并显示Toast LayoutInflater inflater = getLayoutInflater(); View customToastView = inflater.inflate(R.layout.toast_custom, null); TextView textView = customToastView.findViewById(R.id.toast_text); textView.setText("My string"); // 这里传普通String就可以 Toast customToast = new Toast(context); customToast.setDuration(Toast.LENGTH_SHORT); customToast.setView(customToastView); customToast.show();
方法2:给系统Toast的TextView手动设置Span
如果想保留系统Toast的默认样式,只是不想直接传SpannableString,可以先获取Toast内部的TextView,再给它设置Span:
Toast toast = Toast.makeText(context, "My string", Toast.LENGTH_SHORT); // 获取Toast里的文本控件 TextView toastTextView = toast.getView().findViewById(android.R.id.message); if (toastTextView != null) { // 这里还是要用到SpannableString,但不用直接传给Toast的构造方法 SpannableString spannable = new SpannableString("My string"); spannable.setSpan(new BackgroundColorSpan(Color.RED), 0, spannable.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); toastTextView.setText(spannable); } toast.show();
重要提醒
你没法通过把SpannableString转成String来保留样式,因为String本身就是纯文本,不携带任何格式信息。所有的文本样式都是依赖Spannable系列类或者自定义视图来实现的,普通String根本做不到这一点哦。
内容的提问来源于stack exchange,提问作者user8934311
相关产品推荐
相关产品推荐

