【问题标题】:How to properly display <img> tags found in returned json object如何正确显示返回的 json 对象中的 <img> 标签
【发布时间】:2016-04-17 00:08:06
【问题描述】:

我正在使用 volley 从网上获取 json。其中一个 json 对象(“内容”)在返回的字符串中嵌入了 标签。

使用下面的代码,我已成功解析并显示了对象,但“内容”中的图像未显示。 所以我希望图像显示在“内容”对象中的位置。

水果详情

public class FruitDetails extends AppCompatActivity {

    private final String TAG = "FruitDetails";


    TextView fruitTitle, fruitContent;
    NetworkImageView authorImg;
    ImageLoader AuthImgLoader;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fruit_details);

        fruitTitle = (TextView) findViewById(R.id.dfruit_title);
        fruitContent = (TextView) findViewById(R.id.dfruit_content);
        authorImg = (NetworkImageView) findViewById(R.id.author_img);

        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }

        if (savedInstanceState != null) {
            fruitTitle.setText(savedInstanceState.getString("fruitTitle"));
            fruitContent.setText(savedInstanceState.getString("fruitContent"));
        } else {

                loadFruit();

        }
    }

    private void loadFruit() {
        Log.d(TAG, "loadFruit called");

        final ProgressBar progressBar;
        progressBar = (ProgressBar) findViewById(R.id.progress_circle);
        progressBar.setVisibility(View.VISIBLE);


        int news_id = getIntent().getIntExtra("FruitId", -1);
        Log.d(TAG, "You clicked fruit id " + news_id);

        final JsonObjectRequest jsonObjReq = new JsonObjectRequest( DetailConfig.GET_DURL + news_id, null,


                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        Log.d("Debug", response.toString());

                        //Dismissing progressbar;
                        if (progressBar != null) {
                            progressBar.setVisibility(View.GONE);
                        }

                        //Calling method to parse json array
                        parseFruit(response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.d("", "Error: " + error.getMessage());
                    }
                });

        //Creating request queue
        RequestQueue requestQueue = Volley.newRequestQueue(this);

        //Adding request to queue
        requestQueue.add(jsonObjReq);
    }

    //This method will parse json data of fruit
    private void parseFruit(JSONObject jsonObject) {

        Log.d(TAG, "Parsing fruit array");


            try {
                String title = jsonObject.getString(DetailConfig.TAG_DFRUIT_TITLE);
                fruitTitle.setText(Html.fromHtml(title));

                JSONObject pAuthor = jsonObject.getJSONObject("author");
                String authorimg = pAuthor.getString("avatar");

                AuthImgLoader = VolleyRequest.getInstance(getApplicationContext()).getImageLoader();
                AuthImgLoader.get(authorimg, ImageLoader.getImageListener(authorImg, R.drawable.ic_author, R.drawable.ic_author));
                authorImg.setImageUrl(authorimg, AuthImgLoader);


                String content = jsonObject.getString(DetailConfig.TAG_DFRUIT_CONTENT);
                fruitContent.setText(Html.fromHtml(content));

            } catch (JSONException w) {
                w.printStackTrace();
            }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("fruitTitle", fruitTitle.getText().toString());
        outState.putString("fruitContent", fruitContent.getText().toString());

    }

}

我见过the accepted answer to similar question,但我在尝试实现它时遇到问题,它一直告诉我“无法解析符号urlDrawable

UILImageGetter

    import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.Html;
import android.view.View;
import android.widget.TextView;

import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;



public class UILImageGetter implements Html.ImageGetter{
    Context c;
    TextView conatiner;
    UrlImageDownloader urlDrawable;

    public UILImageGetter(View textView, Context context) {
        this.c = context;
        this.conatiner = (TextView) textView;
    }

    @Override
    public Drawable getDrawable(String source) {
        urlDrawable = new UrlImageDownloader(c.getResources(), source);
        urlDrawable.mDrawable = c.getResources().getDrawable(R.drawable.default_thumb);

        ImageLoader.getInstance().loadImage(source, new SimpleListener(urlDrawable));
        return urlDrawable;
    }

    private class SimpleListener extends SimpleImageLoadingListener {
        UrlImageDownloader mUrlImageDownloader;

        public SimpleListener(UrlImageDownloader downloader) {
            super();
            mUrlImageDownloader= downloader;
        }

        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
            int width = loadedImage.getWidth();
            int height = loadedImage.getHeight();

            int newWidth = width;
            int newHeight = height;

            if (width > conatiner.getWidth()) {
                newWidth = conatiner.getWidth();
                newHeight = (newWidth * height) / width;
            }

            if (view != null) {
                view.getLayoutParams().width = newWidth;
                view.getLayoutParams().height = newHeight;
            }

            Drawable result = new BitmapDrawable(c.getResources(), loadedImage);
            result.setBounds(0, 0, newWidth, newHeight);

            mUrlImageDownloader.setBounds(0, 0, newWidth, newHeight);
            mUrlImageDownloader.mDrawable = result;

            conatiner.setHeight((conatiner.getHeight() + result.getIntrinsicHeight()));
            conatiner.invalidate();
        }

    }

    private class UrlImageDownloader extends BitmapDrawable {
        public  Drawable mDrawable;

        public UrlImageDownloader(Resources resources, String filepath) {
            super(resources, filepath);
            mDrawable = new BitmapDrawable(resources, filepath);
        }

        @Override
        public void draw(Canvas canvas) {
            if (mDrawable != null) {
                mDrawable.draw(canvas);
            }
        }
    }
}

【问题讨论】:

  • 我认为真正的答案是你需要一个合适的 HTML 解析器。
  • has &lt;img&gt; tags embedded in the string returned...那么,你能发布那个字符串的内容吗?
  • @BNK 我已将示例添加到我的问题中。我在想Html.ImageGetter,可以吗?
  • IMO,你可以使用一些String方法如indexOf、substr...来获取图片的所有实际Urls(例如"https://example.com/wp-content/uploads/2016/04/Inline_Links.gif"),然后使用Volley的NetworkImageView或使用毕加索加载
  • @BNK 请问我该怎么做?

标签: android json android-volley


【解决方案1】:

最简单的方法是如果 Json 对象只是一个具有以下语法的字符串(img 标签中没有空格):

<img src= "https://www.myWebstie/images/myimgx92dp.png" />

还有!!!你知道它不会改变那么你可以把它子串起来:

String response = "this is your image link";
int x = response.length();
x -= 3;
String subString = new String(response.substring(10, x));

例如 10 表示 img 标记 + src= 位于字符串的开头,3 表示结束标记位于字符串的末尾。

至于您的示例,您应该注意到有时在 img 标记中还有其他信息,例如宽度和高度,因此请确保在没有它的情况下对链接进行子串化,并从中了解图片在您的应用中应该有多大(不要忘记有 px 与 dp 的区别)。


我检查了您在此处发布的内容。

如果这确实是您要解析的网站,我建议您找一个 3rd 方库来解析 html 对象。

似乎jsoup 可以解决问题,但我之前从未使用过它或 Html.ImageGetter,尽管对于您添加的内容而言,jsoup 似乎是更好的选择。

您只需要尝试这两种方法并检查哪种解决方案更适合您。

也检查this

请注意,如果您要下载并显示多张图片甚至视频,您也应该使用 volley 进行下载(在您检索到所有图片链接之后)。

如果它只是前面提到的一张图片,并且该内容只是举例,我仍然建议将其作为子字符串。

【讨论】:

  • img 标签中有src 属性。网址不在标签内
  • 我不是 OP,所以不,但如果响应是 HTML,那么这不是 img 标签的工作方式
  • 如果它不是一个链接,我不知道它还能是什么,也许是一个解码为字符串的图像?然后您还需要使用 sunstring 来摆脱标签,然后您仍然需要将字符串解码为图像。
  • 我正在回复你@cricket_007,是的,它是一个额外的库,但你应该检查你正在编译的内容 - “compile 'com.android.volley:volley:1.0.0”,你可以看到它的 com.android.volley,据我所知,我听说是一个中国人开始的,谷歌可能买了它并做了一些改动,他们甚至在 Android 开发人员上也实现/嵌入(不确定什么是正确的词)网站。
  • 它也在 google I/O 2013 上展示过:youtube.com/watch?v=yhv8l9F44qo
【解决方案2】:

上面我只是简单的使用了UILImageGetter,然后来到FruitDetails写了

protected com.nostra13.universalimageloader.core.ImageLoader mImageLoader;

onCreate之前。

在onCreate中,我写了

mImageLoader = com.nostra13.universalimageloader.core.ImageLoader.getInstance(); mImageLoader.init(ImageLoaderConfiguration.createDefault(this));

那我也改了

fruitContent.setText(Html.fromHtml(content));

FruitDetails

Spanned spanned = Html.fromHtml(content, new UILImageGetter(fruitContent, this), null); fruitContent.setText(spanned);

这解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多