问题描述
我想实现如上图所示的设计。该图像是从 URL 中获取的,我只想在图像中添加一个点击侦听器。尝试使用图像跨度但没有成功。有人能帮我解决这个问题吗?
谢谢
解决方法
您可以在 ClickableSpan
的同一位置设置另一个跨度调用 ImageSpan
。这是一个示例代码:
builder.setSpan(new ClickableSpan() {
@Override
public void onClick(@NonNull View widget) {
Toast.makeText(context,"icon clicked",Toast.LENGTH_SHORT).show();
}
},builder.length() - 1,builder.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
holder.tvTitle.setText(builder);
holder.tvTitle.setMovementMethod(LinkMovementMethod.getInstance());
setMovementMethod 让点击生效很重要。
,我不知道您的限制,但您可以使用如下布局:
nil
并为 ImageView 使用 setOnClickListener。结果:
,这是您问题的更完整答案。我使用可绘制资源,但您可以从位图创建可绘制资源。有关说明,请参阅以下代码。可以将此代码放入您的主要活动(或其他地方)的 onCreate()
。
// Get a string that can be spanned with an ImageSpan and a ClickableSpan.
SpannableString ss = new SpannableString("Some text ");
// This will be the image. I use a resource here,but there are constructors that can
// accept a Drawable. See BitmapDrawable at https://developer.android.com/reference/android/graphics/drawable/BitmapDrawable#BitmapDrawable(android.content.res.Resources,%20android.graphics.Bitmap)
ImageSpan imgSpan = new ImageSpan(this,R.drawable.ic_baseline_airplanemode_active_24,ImageSpan.ALIGN_CENTER);
ClickableSpan cs = new ClickableSpan() {
@Override
public void onClick(@NonNull View widget) {
Toast.makeText(MainActivity.this,"Clicked!",Toast.LENGTH_SHORT).show();
}
};
// The image will overlay the last blank in the text.
ss.setSpan(imgSpan,ss.length() - 1,ss.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// The clickable span will overlay the image from the ImageSpan.
ss.setSpan(cs,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// Just a TextView.
TextView myView = findViewById(R.id.myView);
myView.setText(ss);
// Prevent the ImageSpan from showing a highlight on click.
myView.setHighlightColor(getResources().getColor(android.R.color.transparent));
// Make sure the TextView can be clicked.
myView.setMovementMethod(LinkMovementMethod.getInstance());