简体   繁体   English

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

[英]Android : Adding an imageview right at the end of a textview via ImageSpan and make the image clickable

在此处输入图片说明

I want to achieve a design as shown above in the screenshot.我想实现如上图所示的设计。 The image is fetched from a URL and I want to add a click listener in the image only.该图像是从 URL 中获取的,我只想在图像中添加一个点击侦听器。 Tried using Image span but with no success.尝试使用图像跨度但没有成功。 Could somebody help me through this?有人可以帮我解决这个问题吗?

Thank you谢谢

You can set another span call ClickableSpan at the same place of the ImageSpan .您可以在ImageSpan的同一位置设置另一个跨度调用ClickableSpan Here an example code:这是一个示例代码:

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

It is important to setMovementMethod for the click to work.重要的是要 setMovementMethod 才能让点击生效。

I don't know your limitation, but you can using a layout like bellow:我不知道您的限制,但您可以使用如下布局:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:padding="5dp">

<TextView
    android:id="@+id/top_tv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Papaya (Around)"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    />

<TextView
    android:id="@+id/bottom_tv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=",(2kg)"
    app:layout_constraintTop_toBottomOf="@id/top_tv"
    app:layout_constraintStart_toStartOf="@id/top_tv"/>

<ImageView
    android:id="@+id/iv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_launcher_help"
    app:layout_constraintTop_toTopOf="@id/bottom_tv"
    app:layout_constraintBottom_toBottomOf="@id/bottom_tv"
    app:layout_constraintStart_toEndOf="@id/bottom_tv"/>

</androidx.constraintlayout.widget.ConstraintLayout>

and using setOnClickListener for ImageView.并为 ImageView 使用 setOnClickListener。 The result:结果:

在此处输入图片说明

Here is a more complete answer to your question.这是对您的问题的更完整的答案。 I use a drawable resource, but you can create a drawable from your bitmap.我使用可绘制资源,但您可以从位图创建可绘制资源。 See the following code for a description.有关说明,请参阅以下代码。 This code can be placed into the onCreate() of your main activity (or elsewhere.)可以将此代码放入主要活动(或其他地方)的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, ss.length() - 1, ss.length(), 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());

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM