为了支持Zoom,需要设置WebSetting.setBuiltInZoomControls
Note:如果你为WebView的宽或者高任意一个
WRAP_CONTENT
会得不到想要的效果,所以尽量避免。
1.每个应用又自己的cache和Cookie store
2.而且默认是不支持打开多窗口的,当然你可以自定义这个行为。
有些属性可以帮助适配
1.The window.devicePixelRatio DOM property.
2.The -webkit-device-pixel-ratio CSS media query.
In order to support inline HTML5 video in your application you need to have hardware acceleration turned on.
如果需要使用 html5 的video 需要打开硬件加速
为了支持全屏,不管是video还是其他的html内容。你需要重写WebChromeClient
,并重写onShowCustomView(View, WebChromeClient.CustomViewCallback)
和onHideCustomView()
方法。如果有一个方法没有实现,那么WebView就不会支持全屏。而且 你也可以重写getVideoLoadingProgressView()
方法为vedio一个进度条。
在Android N之后 定位api只支持安全的请求方式比如https。
如果应用请求定位Api通过一个不安全的方式,将会自动的被拒绝,如果没有重写onGeolocationPermissionsShowPrompt(String, GeolocationPermissions.Callback)
方法的话。
在设置WebView的高度的时候推荐使用MATCH_PARENT
来代替WRAP_CONTENT
,如果使用MATCH_PARENT
为WebView设置高度,那么WebView的父View也不能设置WRAP_CONTENT
,否则无法测量正确的高度。
为WebView高度设置为WRAP_CONTENT
出现以下几种行为:
而且为WebView的Width设置Width是无效的,它的宽度将有它的parent来决定。
///////////////////////////////////////////////////////////////////////////////////////////////////////
Using JavaScript in WebView
WebView mWebView = (webView)findViewById(R.id.webview);
WebSetting webSetting = mWebView.getSettings();
webSetting.setJavaScriptEnabled(true);
WebSetting
提供了一些有用的设置。例如如果你使用WevView来构建你的app,你可以通过setUserAgentString()
来自定义User agent
。然后服务器通过判断User Agent就能判断是否是从你自己的app中请求的了。
addJavaScriptInterface
,在你需要JavaScript调用的方法之前。例如:
public class WebAppInterface {
Context mContext;
/** Instantiate the interface and set the context */
WebAppInterface(Context c) {
mContext = c;
}
/** Show a toast from the web page */
@JavascriptInterface
public void showToast(String toast) {
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
}
警告: 如果你设置你的
targetSdkVersion
为17或者更高,你必须设置@JavascriptInterface
给你任何一个你想要在JavaScript中调用的方法。而且这些方法必须是public
的。如果你不设置在andorid4.2或者更高的系统上这些方法是不会被网页调用到的。
上面这段代码 WebAppInterface
类允许网页创建一个Toast
,并调用showToast()
方法。
然后你可以绑定这个类给JavaScript使用,在WebView中使用addJavascriptInterface()
并且给接口命名,例如Android。
WebView webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(new WebAppInterface(this), "Android");
这样就在WebView中创建了一个名字为Android的接口供JavaScript调用。
<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" />
<script type="text/javascript"> function showAndroidToast(toast) { Android.showToast(toast); } script>
这样就可以是用网页调用android代码。
你不需要初始化这个Android接口。因为WebView会自动的提供个网页使用。
Note:这个绑定给JavaScript的运行在其他的线程,而不是运行在构建这个对象的线程。
警告: 使用
addJavascriptInterface()
允许JavaScrip控制Android程序。这样当然是非常有用的,但是也是非常危险的。如果加载到WebView中的Html是攻击者的,那么他可以调用你原生代码中的任意方法。如果一定要注意代码注入和防止用户跳转到别的网页上去。
在使用webview嵌套h5的时候 ,出现了问题,就是偶尔出现 缓存的css加载不出来。只有html能加载出来。而且是在不同的的手机上的效果不一样。而且如果从缓存中加载了数据,就不会又报错的判定。
我的webview设置缓存地址:
getApplicationContext().getCacheDir().getAbsolutePath();
但是并没有用。
之后将缓存地址换为
getApplicationContext().getDir(“cache”, Context.MODE_PRIVATE).getPath(); 然后效果就好多了。
而在setAppCachePath(String appCachePath);的介绍中并没有看出什么。
/**
* Sets the path to the Application Caches files. In order for the
* Application Caches API to be enabled, this method must be called with a
* path to which the application can write. This method should only be
* called once: repeated calls are ignored.
*
* @param appCachePath a String path to the directory containing
* Application Caches files.
* @see #setAppCacheEnabled
*/
不知道是什么鬼。
2.然后就是webview 头部又一个js swiper插件,和webview外层的SwipeRefreshlLayout发生了冲突,当左右滑动swiper的时候,如果稍微向下就会出现,swiper停止的问题。然后我对SwiperRefreshLayout的进行稍微的定制。
3.然后就是webview缓存模式的选择。
缓存模式(5种)
LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据。
LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
最后选择的模式,是根据加载前的网络状态进行调整。如果有网选择 LOAD_DEFAULT模式
如果没有网,则选择LOAD_CACHE_ELSE_NETWORK。