【问题标题】:Android: Textview imageGetter display html content and image. Cache image of ImageGetterAndroid:Textview imageGetter 显示html内容和图片。 ImageGetter 的缓存图像
【发布时间】:2016-03-19 02:49:03
【问题描述】:

我是 Android 编程新手。目前,我开发了一个应用程序来使用 ImageGetter 和 Html.fromHtml() 在 TextView 中显示 HTML 内容。我是否可以将内容和图像缓存在 TextView 中以便我可以离线查看图像?

【问题讨论】:

    标签: android image textview browser-cache


    【解决方案1】:

    嗯,几天前我也在做同样的事情。我使用 ImageGetter 用 textview 显示 html。但它没有给出建议的结果。所以然后我使用 Jsoup libaray 并提取元素并将它们显示在Textvew 中,当img 标签出现时,我使用 UIL 通用图像库在Imageview 中显示图像。那么这个 libaray 有缓存图像的选项。 您只需要缓存 html 字符串,然后将其与 layout rest jsoup 一起传递给以下类,UIL 将处理。

    public class PostContentHandler {
    Context context;
    String  content;
    LinearLayout linearLayout;
    public PostContentHandler(Context context, String content , LinearLayout linearLayout){
        this.context=context;
        this.content=content;
        this.linearLayout=linearLayout;
    
    }
    
    public void setContentToView(){
        List<String> p = new ArrayList<>();
        List<String> src = new ArrayList<>();
        Document doc = Jsoup.parse(content);
    
        Elements elements = doc.getAllElements();
    
        for(Element element :elements){
            Tag tag = element.tag();
            if(tag.getName().matches("h[1-6]{1}")){
                String heading = element.select(tag.getName().toString()).text();
                TextView textView = new TextView(context);
                textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                        LinearLayout.LayoutParams.WRAP_CONTENT));
                textView.setTextSize(20);
                textView.setText(heading);
                textView.setPadding(5, 0, 5, 0);
                textView.setTextColor(R.color.black);
                linearLayout.addView(textView);
            }
    
            if(tag.getName().equalsIgnoreCase("p")){
                element.select("img").remove();
                String body= element.html();
                TextView textView = new TextView(context);
                textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                        LinearLayout.LayoutParams.WRAP_CONTENT));
                textView.setText(Html.fromHtml(body));
                textView.setTextColor(R.color.black);
                textView.setPadding(10,0,10,0);
                linearLayout.addView(textView);
                p.add(body);
            }
            if (tag.getName().equalsIgnoreCase("img")){
                String url  = element.select("img").attr("src");
    
    
                final ImageView imageView = new ImageView(context);
                imageView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                        LinearLayout.LayoutParams.WRAP_CONTENT));
                ImageLoader imageLoader = ImageLoader.getInstance();
                imageLoader.displayImage(url, imageView, new SimpleImageLoadingListener() {
                    @Override
                    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                        super.onLoadingComplete(imageUri, view, loadedImage);
                        int height=loadedImage.getHeight();
                        imageView.getLayoutParams().height=getScreenWidth();
                        imageView.setAdjustViewBounds(true);
                        imageView.requestLayout();
    
                    }
    
                    @Override
                    public void onLoadingStarted(String imageUri, View view) {
                        super.onLoadingStarted(imageUri, view);
                    }
                });
    
                linearLayout.addView(imageView);
                src.add(url);
            }
    
        }
    }
    public static int getScreenWidth() {
        return Resources.getSystem().getDisplayMetrics().widthPixels;
    }
    }
    

    【讨论】:

    • 请问我该如何调用这个函数,如何将html字符串传递给这个函数?抱歉,我是 Android 编程新手。
    • 使用图像视图显示图像。不是文本视图
    • 感谢您的反馈。最后我弄清楚你的代码。但是,在 imageLoader.displayImage() 行有语法错误。报错原因:java.lang.IllegalStateException: ImageLoader must be init with configuration before using
    • 你会得到你没有配置 Universal Image Loader libaray 的错误
    • 我已经配置了通用图像库。现在显示没有错误,但我仍然无法显示图片。
    【解决方案2】:

    这是我的代码。我尝试调试,它显示代码进入 onLoadingFailed() 而没有进入 onLoadingComplete()。我不知道为什么。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        linearLayout = (LinearLayout)findViewById(R.id.linearLayout1);
         DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
                .cacheOnDisc(true).cacheInMemory(true)
                .imageScaleType(ImageScaleType.EXACTLY)
                .displayer(new FadeInBitmapDisplayer(100)).build();
    
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
                getApplicationContext())
                .defaultDisplayImageOptions(defaultOptions)
                .memoryCache(new WeakMemoryCache())
                .discCacheSize(10 * 1024 * 1024).build();
    
        ImageLoader.getInstance().init(config);
        setContentToView();
    }
    
    public void setContentToView(){
        List<String> p = new ArrayList<>();
        List<String> src = new ArrayList<>();
        Document doc = Jsoup.parse(content);
        Elements elements = doc.getAllElements();
    
        for(Element element :elements){
            Tag tag = element.tag();
            if(tag.getName().matches("h[1-6]{1}")){
                String heading = element.select(tag.getName().toString()).text();
                TextView textView = new TextView(this);
                textView.setText(Html.fromHtml(heading));
                textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                        LinearLayout.LayoutParams.WRAP_CONTENT));
                linearLayout.addView(textView);
            }
    
    
            if(tag.getName().equalsIgnoreCase("p")){
                element.select("img").remove();
                String body= element.html();
                TextView textView = new TextView(this);
                textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                        LinearLayout.LayoutParams.WRAP_CONTENT));
                textView.setText(Html.fromHtml(body));
                this.linearLayout.addView(textView);
                p.add(body);
            }
    
    
            if (tag.getName().equalsIgnoreCase("img")){
                String url  = element.select("img").attr("src");
                final ImageView imageView = new ImageView(this);
                imageView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                        LinearLayout.LayoutParams.WRAP_CONTENT));
                ImageLoader imageLoader = ImageLoader.getInstance();
                imageLoader.displayImage(url, imageView, new SimpleImageLoadingListener() {
                    @Override
                    public void onLoadingStarted(String imageUri, View view) {
                        super.onLoadingStarted(imageUri, view);
    
                    }
    
                    @Override
                    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                        super.onLoadingComplete(imageUri, view, loadedImage);
                        int height=loadedImage.getHeight();
                        imageView.getLayoutParams().height=getScreenWidth();
                        imageView.setAdjustViewBounds(true);
                        imageView.requestLayout();
                    }
    
                    @Override
                    public void onLoadingCancelled(String imageUri, View view) {
                        super.onLoadingCancelled(imageUri, view);
                    }
    
                    @Override
                    public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
                        super.onLoadingFailed(imageUri, view, failReason);
                    }
                });
    
                linearLayout.addView(imageView);
                src.add(url);
            }
        }
    }
    
    public static int getScreenWidth() {
        return Resources.getSystem().getDisplayMetrics().widthPixels;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-13
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多