我想在 TextView 作为一个笑脸。我有一个方法,得到一个字符串,并将ImageSpans添加到一个CharSequence中,以替换文本表情符号,如 :-) 与图形版本。
public Spannable addSmileySpans(CharSequence text) {
SpannableStringBuilder builder = new SpannableStringBuilder(text);
Matcher matcher = mPattern.matcher(text);
while (matcher.find()) {
int resId = mSmileyToRes.get(matcher.group());
builder.setSpan(new ImageSpan(mContext, resId),
matcher.start(), matcher.end(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return builder;
}
然后我在我的适配器上使用它。
viewHolder.txtReceivedBody.setText(parser.addSmileySpans(message.body));
另外,这里定义了TextView元素。
<TextView
android:id="@+id/txtReceivedBody"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/imgReceivedDirection"
android:layout_marginRight="30dp"
android:background="@drawable/selector_conversation_received"
android:minHeight="40dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:textSize="18sp"
android:autoLink="all"
android:gravity="right"/>
不幸的是,在TextView中没有显示图像,只显示一个主字符串。我应该怎么做才能解决这个问题?
提供你的模式
我的模式是[图像的id]
textview.setText(addSmileySpans(context,edit_text.getText()));
public CharSequence addSmileySpans(Context context, CharSequence msg) {
SpannableStringBuilder builder = new SpannableStringBuilder(your_recieved_message);
Pattern pattern = Pattern.compile("\\[([^\\[\\]]+)\\]");
if( pattern != null )
{
Matcher matcher = pattern.matcher( your_recieved_message );
int matchesSoFar = 0;
while( matcher.find() )
{
CharSequence cs =matcher.group().subSequence(1, matcher.group().length()-1);
int value = Integer.parseInt(cs.toString());
System.out.println("pattern is::"+matcher.group().subSequence(1, matcher.group().length()-1));
int start = matcher.start() - (matchesSoFar * 2);
int end = matcher.end() - (matchesSoFar * 2);
Drawable Smiley = context.getResources().getDrawable(value);
Smiley.setBounds(0, 0,15,15);
builder.setSpan(new ImageSpan(Smiley), start + 1, end - 1, 0 );
builder.delete(start, start + 1);
builder.delete(end - 2, end -1);
matchesSoFar++;
}
}
return builder;
}
Kotlin版本的 Manthan Patel回答
open fun addSmileySpans(context: Context, msg: CharSequence?): CharSequence? {
val builder = SpannableStringBuilder(msg)
val pattern: Pattern = Pattern.compile("\\[([^\\[\\]]+)\\]")
val matcher: Matcher = pattern.matcher(msg)
var matchesSoFar = 0
while (matcher.find()) {
val cs: CharSequence = matcher.group().subSequence(1, matcher.group().length - 1)
println("pattern is::" + matcher.group().subSequence(1, matcher.group().length - 1))
val start: Int = matcher.start() - matchesSoFar * 2
val end: Int = matcher.end() - matchesSoFar * 2
val value = cs.toString()
val resources: Resources = context.resources
val resourceId: Int = resources.getIdentifier(value, "drawable", context.packageName)
val drawable = ContextCompat.getDrawable(context, resourceId)
drawable?.setBounds(0, 0, drawable.intrinsicHeight, drawable.intrinsicWidth)
builder.setSpan(ImageSpan(drawable), start + 1, end - 1, 0)
builder.delete(start, start + 1)
builder.delete(end - 2, end - 1)
matchesSoFar++
}
return builder
}
使用方法
用名称创建可绘制的res 微笑所以,现在你有可绘制的 R.drawable.ic_smile
而且可以通过
val icSmile = ContextCompat.getDrawable(context,R.drawable.ic_smile)
要将其添加到文本视图,请使用。
val text = "[ic_smile] My text"
textView.text = addSmileySpans(requireContext(),text)