如何在TextView Android上使用带有文本的图像(设备的存储图像)?

我正在创建聊天应用程序,我从服务器获取EMOJI (IMAGE URLS)。

我正在使用此图像(表情符号url)在我的TextView通过下面的代码行使用文本。

 String stringWithHtml = "Sample string with an " + ""+ ""; Drawable drawable = Drawable.createFromStream(new URL(source).openStream(), "src name"); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); Spanned spannedValue = Html.fromHtml(stringWithHtml, drawable, null); MY_TEXTVIEW.setText(spannedValue); 

这一切,我在AsynTask并获得如下预期结果: –

我的结果

现在我将所有表情符号(图像)存储在我的设备上,并希望在TextView中将其与文本一起使用。

我的问题是我们如何在TextView上使用带有文本的设备(存储图像)?

我在SO上搜索了它但没有得到预期的结果。请检查我访问过的以下链接。

1.第一链接
2.第二链接
3.第三链接
4. Forth Link

我已经使用了ImageSpan但是出现了另一个问题,我已经在SO上发布了问题点击此处

请帮我解决这个问题。谢谢😊

好。 你甚至不需要Uri。 尝试这个:

 String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/car_icon.png"; String stringWithHtml = "Sample string with an " +" " +" "; Html.ImageGetter getter = new Html.ImageGetter() { @Override public Drawable getDrawable(String s) { return BitmapDrawable.createFromPath(s); } }; Spanned spannedValue = Html.fromHtml(stringWithHtml, getter, null); text.setText(spannedValue);' 

您可以实现一个java程序来获取您收到的表情符号的计数。

并使用以下程序在UIView中动态创建ImageView组件。 请使用循环结构尽可能多地重复。

 ImageView iv = new ImageView(); RelativeLayout parentView = findViewById("R.id.parentViewId"); parentView.addView(iv, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

这是从服务器和sdcard加载textview图像的代码..你可以使用sdcard相关的代码:)

 Spanned spanned = null; String messageCustomized = ""; Spanned span = Html.fromHtml(messageCustomized, new URLImageParser(sentMessagesViewHolder.tvMessage, context), null); if (spanned!=null) { spanned = (Spanned) TextUtils.concat(spanned, span); }else spanned= span; if (spanned!=null) { txtView.setText(spanned); } 

ImageGetter

 public class URLImageParser implements ImageGetter { Context context; View container; private int imageSize = 20; private int imageSizeDisplaySize = 20; URLDrawable urlDrawable = null; public URLImageParser(View container, Context context) { this.context = context; this.container = container; imageSize = Utility.convertDpTopPixels(context, 20); imageSizeDisplaySize = Utility.convertDpTopPixels(context, 35); } @Override public Drawable getDrawable(final String fileName) { urlDrawable = new URLDrawable(); Drawable drawable = null; if (Build.VERSION.SDK_INT >= 21) drawable = context.getDrawable(R.drawable.profile_main_placeholder); else drawable = context.getResources().getDrawable(R.drawable.profile_main_placeholder); drawable.setBounds(0, 0, 0 + imageSize, 0 + imageSize); urlDrawable.drawable = drawable; Bitmap bitmap = null; bitmap = ImageUtility.getImageFromSDCard(fileName); if (bitmap != null) { // the bitmap is available bitmap = RoundedImageView.getCroppedBitmap(bitmap, imageSize, imageSize, imageSize); drawable = new BitmapDrawable(context.getResources(), bitmap);//ImageUtility.bitmapToDrawable(context,resource); drawable.setBounds(0, 0, 0 + imageSize, 0 + imageSize); //set the correct bound according to the result from HTTP call URLImageParser.this.urlDrawable.drawable = drawable; } return urlDrawable.drawable; } } 

URLDrawable

 public class URLDrawable extends BitmapDrawable { protected Drawable drawable; @Override public void draw(Canvas canvas) { // override the draw to facilitate refresh function later if(drawable != null) { drawable.draw(canvas); } } } 

您可以使用emojicon库,也可以参考这里包含的示例源代码。

      

你可以添加如下的自定义表情符号

  EmojiconsView emojiconsView = (EmojiconsView) findViewById(R.id.emojicons_view); emojiconsView.setPages(Arrays.asList( new EmojiconPage(Emojicon.TYPE_PEOPLE, null, false, R.drawable.ic_emoji_people_light), new EmojiconPage(Emojicon.TYPE_NATURE, null, false, R.drawable.ic_emoji_nature_light), new EmojiconPage(Emojicon.TYPE_OBJECTS, null, false, R.drawable.ic_emoji_objects_light), new EmojiconPage(Emojicon.TYPE_PLACES, null, false, R.drawable.ic_emoji_places_light), new EmojiconPage(Emojicon.TYPE_SYMBOLS, null, false, R.drawable.ic_emoji_symbols_light) )); } 

在此处输入图像描述