如何在Android的TextView中显示图片?

61

我想在TextView中插入一些图片,如何实现?有什么想法吗?


2
请参阅此文章,了解如何将复合绘图设置为TextView:http://mgmblog.com/2010/06/04/setcompounddrawable-to-add-drawables-to-textview/ - Salil
使用前两个答案,您无法在文本之间添加图像,只能在顶部、底部、左侧或右侧添加图像,但我的解决方案允许您在文本中添加所需索引的图像。 - Buda Gavril
'Dawid'更新的答案非常简洁。 - Darpan
7个回答

73
你可以创建一个SpannableString,在TextView中放置你想要的图像。或者你可以使用
ImageSpan is = new ImageSpan(context, resId);
text.setSpan(is, index, index + strLength, 0);

1
这不会导致索引超出范围异常吗?因为第三个参数,即int end,超出了字符串的长度。 - Lendl Leyba
5
@LeiLeyba 正确。真正的答案应该是:final Spannable text = new SpannableString(string + " "); text.setSpan(is, string.length(), 1 + string.length(), 0);,这将在给定字符串的末尾添加一个图像。 - android developer
如果您想在文本周围放置一张图片,请注意,如果您跨越一个“空格”字符并且文本视图在该位置插入换行符,则不会显示该图片。我猜测在这种情况下,文本视图会剪切所有空格,导致该图片无法在该位置显示。请使用一个像“x”这样的虚拟字符,它不会被文本视图剪切。 - Kedu
如果用户正在EditText框中编写内容,并希望同时添加一张图片,该怎么办?例如,假设这是一个笔记应用程序,他们想要在笔记中添加图片?是否使用相同的过程? - SmiffyKmc
这里的“text”是SpannableString。 - Atul Bhardwaj
@BudaGavril,我们能否像IMAGE..123456789..IMAGE..这样在TextView中使用设备存储的图像,请帮我解决一下。 - Ravindra Kushwaha

62

你可以更加轻松地使用来自API 1的SpannableStringBuilder

示例用法:

对于API >= 21

    SpannableStringBuilder builder = new SpannableStringBuilder();
    builder.append("My string. I ")
            .append(" ", new ImageSpan(getActivity(), R.drawable.ic_action_heart), 0)
            .append(" Cree by Dexode");

    textView.setText(builder);

对于API >= 1

    SpannableStringBuilder builder = new SpannableStringBuilder();
    builder.append("My string. I ").append(" ");
    builder.setSpan(new ImageSpan(getActivity(), R.drawable.ic_action_heart),
            builder.length() - 1, builder.length(), 0);
    builder.append(" Cree by Dexode");

    textView.setText(builder);

嘿,有没有办法像上面添加图像到textview一样,在textview中添加edittext? - Anudeep
@Anu 你一定要试试 :) 但是答案很可能是肯定的。在编辑文本中检查表情符号 :) - Gelldur
这看起来很有趣:https://github.com/hitanshu-dhawan/SpannableStringParser - Gelldur

25
ImageSpan is = new ImageSpan(context, R.drawable.arrow);
SpannableString text = new SpannableString("Lorem ipsum dolor sit amet");
text.setSpan(is, 5, 5 + 10, 0);

11

像这样做些事情。

textView.setCompoundDrawableWithIntrinsicBounds(yourImg, null, null, null);

1
制作 custom.xml
       <RelativeLayout
           xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_width="fill_parent"
          android:layout_height="wrap_content">
          <ImageView 
               android:id="@+id/thumbnail_view"
               android:src="@drawable/ic_launcher"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content" />

    <TextView android:id="@+id/message_view"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_toRightOf="@id/thumbnail_view"
               android:textSize="18sp"
               android:text="MyText" />
      </RelativeLayout>

然后在main.xml中,包含这个custom.xml文件。

       <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical" 
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"  
          android:gravity="center_horizontal">

   <include 
        android:id="@+id/customView"
         layout="@layout/custom"/>

           </LinearLayout>

这是我的mainActivity.class文件。
  package com.example.test;


 import android.app.Activity;
 import android.os.Bundle;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.ImageView;
  import android.widget.TextView;


     public class MainActivity extends Activity implements OnClickListener {

   private String TAG = MainActivity.class.getSimpleName();
  ImageView img;
  ImageView img1;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    TextView txt = (TextView)findViewById(R.id.message_view);
     img = (ImageView) findViewById(R.id.thumbnail_view);
     img1 = (ImageView) findViewById(R.id.thumbnail_view1);

    img.setOnClickListener(this);
    img1.setOnClickListener(this);

}
@Override
public void onClick(View v) {
    if(v== img){
        // do something for img
    }
    else if (v== img1){
        //do something for img1
    }

}
}

0

0
如果你想在视图的末尾添加图片,可以跟随我的步骤。
  ImageSpan is = new ImageSpan(context, R.drawable.arrow);
  SpannableString text = new SpannableString("Lorem ipsum dolor sit amet"+"  ");
  text.setSpan(is, text.length()-2, text.length(), 0);

如果需要将图像居中对齐,您可以使用以下方法:

ImageSpan center vertical

建议参考 @amy 的回答。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接