webview android 页面怎么让webview缩小和放大

android 关于webview缩放和适应屏幕的问题
[问题点数:30分,无满意结帖,结帖人u]
android 关于webview缩放和适应屏幕的问题
[问题点数:30分,无满意结帖,结帖人u]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关推荐:
2014年6月 移动开发大版内专家分月排行榜第一2014年3月 移动开发大版内专家分月排行榜第一
2014年11月 移动开发大版内专家分月排行榜第二2014年4月 移动开发大版内专家分月排行榜第二2014年2月 移动开发大版内专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。Android&WebView&不能缩放相关问题
Android中使用WebView&Demo如下:
WebView&wv=(WebView)&findViewById(R.id.wv);
WebSettings&ws&=&wv.getSettings();
ws.setUseWideViewPort(true);
ws.setJavaScriptEnabled(true);&&&
ws.setSupportZoom(true);&//设置可以支持缩放
ws.setDefaultZoom(WebSettings.ZoomDensity.FAR);&&
ws.setBuiltInZoomControls(true);//设置出现缩放工具
wv.setWebViewClient(new&MyWebViewClient());//设置用WebView打开内部链接
&&&&private&class&MyWebViewClient&extends&WebViewClient&{&
&&&&&&&&@Override&
&&&&&&&&public&boolean&shouldOverrideUrlLoading(WebView&view,&String&url)&{&
&&&&&&&&&&&&view.loadUrl(url);&
&&&&&&&&&&&&return&&
&&&&&&&&}&
//wView.loadUrl("");
&-----打开本包内asset目录下的index.html文件
//wView.loadUrl("content://com.android.htmlfileprovider/sdcard/index.html");-----打开本地sd卡内的index.html文件
//wView.loadUrl("");-----打开指定URL的html文件
&&&&通常情况下,设置了ws.setSupportZoom(true)和ws.setBuiltInZoomControls(true)之后,WebView中显示的网页即可以进行缩放。
但是在测试中发现,使用淘宝网的网址加载,如下:
wv.loadUrl("");
该网页的缩放功能不生效。
&&&&一直纳闷,还以为是设置的属性不生效。查了很多资料,看了google源码,得出的结论都一样,就是设置了上面两个属性就ok了。后来抱着侥幸的心理,试了试其他的网址:
wv.loadUrl("");没想到还真是可以缩放的。
一查资料才发现,上面的设置仅限于打开的网页支持缩放功能,支不支持缩放功能取决于html的设置。若html中设置了以下属性:
content="width=device-width,&initial-scale=1,&user-scalable=no,&minimum-scale=1.0,&maximum-scale=1.0"&
该网页在WebView中显示的时候即是不支持缩放的。
对比了UC浏览器,其中有个强制缩放的功能。后续有时间学习一下这个强制缩放功能的实现。
&&&&&&&&&&&&&&&&&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。我要用webview加载网页,怎么让网页适配手机,或者在手机端做,更改webview的显示,还是怎么实现,求指点,第一次做这个,网页直接加载会很大
该问题被发起重新开启投票
投票剩余时间:
之前被关闭原因:
该问题被发起删除投票
投票剩余时间:
距离悬赏到期还有:
参与关闭投票者:
关闭原因:
该问题已经被锁定
锁定原因:()
保护原因:避免来自新用户不合宜或无意义的致谢、跟帖答案。
该问题已成功删除,仅对您可见,其他人不能够查看。
WebSettings mWebSettings=mWebView.getSettings();mWebSettings.setBuiltInZoomControls(true); // 支持页面放大缩小按钮mWebSettings.setSupportZoom(true);
我是这样做的,可以支持网页缩放~
不是您所需,查看更多相关问题与答案
德问是一个专业的编程问答社区,请
后再提交答案
关注该问题的人
共被浏览 (7063) 次android中如何实现离线缓存
离线缓存就是在网络畅通的情况下将从服务器收到的数据保存到本地,当网络断开之后直接读取本地文件中的数据。
将网络数据保存到本地:
你可以自己写一个保存数据成本地文件的方法,保存在android系统的任意目录(当然是有权限的才行),但是在这种情况下使用Context的openFileOutput方法最简便也最符合我们的场景,下面的saveObject方法演示了如何用openFileOutput将数据保存在本地的一个文件中:
saveObject
public static boolean saveObject(Serializable ser, String file) {
FileOutputStream fos =
ObjectOutputStream oos =
fos = AppContext.getInstance().openFileOutput(file, AppContext.getInstance().MODE_PRIVATE);
oos = new ObjectOutputStream(fos);
oos.writeObject(ser);
oos.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
oos.close();
} catch (Exception e) {
fos.close();
} catch (Exception e) {
openFileOutput可以直接获得一个和应用关联的文件路径(在/data/data//files下面),然后使用java io中的ObjectOutputStream将序列化的对象写入(writeObject)到得到的文件中,你可以看到上面的实现过程有两个关键方法:openFileOutput、writeObject以及调用它们的两个关键对象Context和ObjectOutputStream。关于序列化可以参看这篇文章:对象的序列化和反序列化实践
这是将一个序列化的对象保存在本地,跟我们的离线缓存保存网络数据有什么关系呢?
有关系,因为网上获取的数据大多可以转换成String类型的字符串,现在服务端返回的数据一般是json格式的字符串。而String类型的字符串其实就是可序列化的对象。下面是一个服务器返回json数据的例子(其实就是jcodecraeer网站的一个移动客户端升级接口):
{url:/uploads/soft/android/CodeBox.apk,versionCode:7,updateMessage:增加离线缓存,分类筛选功能修正了版本兼容性问题 }
用上面的saveObject方法我们可以将数据保存在本地,为了能够取出这个文件我们必须想好如何为这个保存的文件命名,如果是单纯的一篇文章的数据,我们可以直接将文件名命名为这篇文章的id,因为id是唯一的,为了尽可能的不和其他数据发生冲突,你还可以在这个id之前加一个前缀,比如这篇文章是java栏目下的我们可以这样 arc_java_id。如果是文章列表我们可以这样命名:文章类别_分页页码,总之命名的原则是能和其他离线数据区别,有唯一性。为什么不用url作为文件名呢?url肯定是唯一的,但是url不一定符合文件的命名规范。
下面来讲解如何读取本地缓存的数据
读取缓存的时候我们只需要知道文件名就可以了,下面的readObject方法实现了根据文件名读取缓存数据。其实很多东西是和上面保存数据对应的。
readObject
* 读取对象
* @param file
* @throws IOException
public static Serializable readObject(String file) {
FileInputStream fis =
ObjectInputStream ois =
fis = AppContext.getInstance().openFileInput(file);
ois = new ObjectInputStream(fis);
return (Serializable) ois.readObject();
} catch (FileNotFoundException e) {
} catch (Exception e) {
e.printStackTrace();
} finally {
ois.close();
} catch (Exception e) {
fis.close();
} catch (Exception e) {
下面的代码演示了如何用上面的知识存储和读取网络数据
String key = codelist_ +
mCategory.getValue()
String result = ;
if (HttpUtil.isNetworkConnected()) {
result = HttpUtil.http_get(AppContext.getInstance(), url );
HttpUtil.saveObject(result, key);
result = (String) HttpUtil.readObject(key);
result = (String) HttpUtil.readObject(key);
if (result == null)
当网络畅通时,从服务器获取数据( HttpUtil.http_get(AppContext.getInstance(), url )),同时将数据保存到本地(HttpUtil.saveObject),而当网络不可用时,直接从本地读取缓存的数据,不跟服务器发生交互。
其中HttpUtil是跟网络相关的工具类,这里涉及到它的三个方法:
isNetworkConnected()判断网络是否可用
saveObject上面已经给出了实现
readObject上面已经给出了实现
http_get读取指定url的服务器数据
而AppContext.getInstance()是我自己写的,是为了方便在HttpUtil的静态方法中获得Context对象。
这里的key就是文件名。
额外的需求
有时候我们还有这样的需求,当用户在指定间隔时间内读取同一数据源时,从本地获取,超过这个时间间隔从网络获取,这样做的目的是节省用户的流量,同时也避免了每次从网络获取数据造成的界面延迟。
下面实现了如何根据时间间隔判断是否需要刷新服务器数据,true表示不需要,false表示需要(很别扭是吧,这跟isCacheDataFailure这个命名有关系):
public static boolean isCacheDataFailure(String cachefile) {
boolean failure =
File data = AppContext.getInstance().getFileStreamPath(cachefile);
if (data.exists()
&& (System.currentTimeMillis() - data.lastModified()) & CACHE_TIME)
else if (!data.exists())
将当前时间和文件的修改时间做比较 ,CACHE_TIME是一个固定值(毫秒),你可以替换成任意int类型。
将这个判断条件加入,然后上面的代码改成:
String key = codelist_ +
mCategory.getValue()
String result = ;
if (HttpUtil.isNetworkConnected() && HttpUtil.isCacheDataFailure(key)) {
result = HttpUtil.http_get(AppContext.getInstance(), url );
HttpUtil.saveObject(result, key);
result = (String) HttpUtil.readObject(key);
result = (String) HttpUtil.readObject(key);
if (result == null)
上面的步骤对于一般应用来说已经够用了,但是在要求比较高的情况下,我们还得考虑随着时间的流逝,缓存数据会越来越多,因此我们需要增加删除过期缓存的功能,原理就是设置一个阀值,在保存缓存的时候,判断当前缓存的总量是否大于阀值,如果是则删除时间较早的缓存。
这个实现起来有点复杂,可以考虑更简单的方案,定期检查(或者用户每打开一次程序)缓存总量,当大于阀值,提示用户主动删除。具体实现就不多说了。
注:openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符&/& ,如果文件不存在, 会自动创建它。创建的文件保存在/data/data//files目录,如: /data/data/cn.itcast.action/files/itcast.txt ,通过点击Eclipse菜单&Window&-&Show View&-&Other&,在对话窗口中展开android文件夹,选择下面的File Explorer视图,然后在File Explorer视图中展开/data/data//files目录就可以看到该文件。
openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为: Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
如果希望文件被其他应用读和写,可以传入:
openFileOutput(&itcast.txt&, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE)两天热门文章
最新推荐文章

我要回帖

更多关于 android webview 放大 的文章

 

随机推荐