试图加载下载的网页和图像

时间:2012-04-07 19:35:41

标签: android webview textview

我已经下载了网页html及其中的图片。现在,我正在尝试将它们显示给用户。我尝试过两种不同的方法,但不确定哪种方法最好用。两者都有他们的问题。

首先,我尝试使用以下代码的文本视图:

TextView content = (TextView)findViewById(R.id.article_content);

MyImageGetter mig = new MyImageGetter(this, urlId);
Spanned span = Html.fromHtml(contents, mig, null);
content.setText(span);

除了两个问题,我真的很喜欢它的工作原理。第一个也是最困难的是当一篇文章有​​很多图像时,我得到OutOfMemory fc。 MyImageGetter代码如下

public class MyImageGetter implements Html.ImageGetter{

String urlId = null;
Context c = null;

public MyImageGetter(ArticleViewer articleViewer, String urlId2) {
    c = articleViewer;
    urlId = urlId2;
}

public Drawable getDrawable(String source) {
    String[] brokenUrl = source.split("/");
    String imgName = brokenUrl[brokenUrl.length-1];

    File image = new File("/data/data/com.that1dev.RibbonReader/Offline/" + urlId + "/" + imgName);
    Log.w("MyApp", image.getAbsolutePath());
    Bitmap bm = BitmapFactory.decodeFile(image.getAbsolutePath());

    Drawable d = new BitmapDrawable(c.getResources(), bm);

    d.setBounds(0,0, d.getIntrinsicWidth(),d.getIntrinsicHeight());

    return d;
}

}

另一个问题是textview根据用户选择和设备方向有不同的宽度。如果视图中的图像大于文本视图宽度,则会被裁剪。但是,我相信我可以在没有太多困难的情况下解决这个问题。我还没有尝试过太努力,因为我正试图先解决内存问题。但是,对任何一方的任何帮助都将非常感激。

我尝试的另一种方法是webview。

WebView webContent = (WebView)findViewById(R.id.web_content);

webContent.loadDataWithBaseURL("", contents[1], "text/html", "utf-8", "");
webContent.setBackgroundColor(Color.TRANSPARENT);

不幸的是,无论我尝试什么,背景都会保持白色,并且令人难以置信的难看。我似乎无法找到适用于3.0和4.0的工作。

如果我有一个选择,我真的很喜欢TextView方法,因为我更喜欢它的外观与WebView呈现的方式。

1 个答案:

答案 0 :(得分:1)

从根本上说,你在这里要做的是改变网络内容的呈现方式 - 交换网站编写者(可能是你,我不知道)写的背景是什么。无论如何HTML并不真正支持Web内容的透明背景,因此我唯一能想到的就是通过JavaScript实际编辑Web内容:

myWebView.loadUrl("javascript:document.body.style.backgroundImage=\'\');
   document.body.style.backgroundColor=\"#00FF00\");");

(将上面的颜色替换为您选择的颜色),调用WebView加载后将清除HTML上的任何背景,但是当涉及到任何嵌套样式时,您仍然会遇到问题。

至于你的图像问题,你打开所有图像的默认大小并将它们保存在内存中。 WebView为您做的一件事就是保持网页图像的抽象(如缩小)渲染。如果你想修复你的内存占用,你最好的办法就是暂时将图像保存到磁盘上,只有当用户滚动到图像所需的位置时才打开它们 - 这无论如何都不容易,但这是确保您不会溢出分配的堆空间的唯一方法。