Android:通过 ImageSpan 在文本视图的末尾添加一个图像视图并使图像可点击

问题描述

enter image description here

我想实现如上图所示的设计。该图像是从 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。结果:

enter image description here

,

这是您问题的更完整答案。我使用可绘制资源,但您可以从位图创建可绘制资源。有关说明,请参阅以下代码。可以将此代码放入您的主要活动(或其他地方)的 onCreate()

enter image description here

// 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());