声明在先:必须在AndroidMainfest.xml 里面声明权限,不然在Java里面编写的全部WebView浏览网页的代码都没法正常使用javascript
<uses-permission android:name="android.permission.INTERNET" />
(a). 建立WebView的实例加入到Activity中html
WebView webview = new WebView(this);
setContentView(webview);
或者在xml中配置WebViewjava
<Webview
android:layout_width="match_parent" android:layout_height="match_parent" > </Webview>
(b). 访问网页android
webview.loadUrl("https://www.baidu.com/");
public void loadData (String data, String mimeType, String encoding)
加载指定的data数据web
参数说明:数据库
data 字符串String形式的数据 能够经过base64编码而来api
mineType data数据的 MIME类型, e.g. 'text/html'浏览器
encoding data数据的编码格式安全
注意:cookie
1.Javascript有同源限制,同源策略限制了一个源中加载文本或者脚本与来自其余源中的数据交互方式。避免这种限制可使用loadDataWithBaseURL()方法。
2.encoding参数制定data参数是否为base64或者 URL 编码,若是data是base64编码那么 encoding必须填写 "base64“。
public void loadDataWithBaseURL (String baseUrl, String data, String mimeType, String encoding, String historyUrl)
使用baseUrl加载base URL的网页内容,baseUrl解决相关url使用Javascript相同源问题。
public void loadUrl (String url)
加载制定url的网页内容
public void loadUrl (String url, Map<String, String> additionalHttpHeaders)
加载制定url并携带http header数据。
public void reload ()
从新加载页面 注意:页面全部资源会从新加载
public void stopLoading ()
中止加载页面
public void goBack () // 页面后退 public void goForward () // 页面前进 public void goBackOrForward (int steps) // 以当前的index为起始点前进或者后退到历史记录中指定的steps, 若是steps为负数则为后退,正数则为前进 public boolean canGoForward () // 判断页面是否可以前进 public boolean canGoBack () // 判断页面是否可以后退
public void addJavascriptInterface (Object object, String name)
当网页须要和App进行交互时,能够注入Java对象提供给JavaScritp调用. Java对象提供相应的方法供js使用.
注意:在Android 4.2如下使用这个api会涉及到JavaScript安全问题, javascript能够经过反射这个Java对象的相关类进行攻击。
连接:Android WebView 总结 —— Java和JavaScript交互
连接:Android 4.2版本如下使用WebView组件addJavascriptInterface方法存在JS漏洞
public void evaluateJavascript (String script, ValueCallback<String> resultCallback)
这个方法在Android 4.4系统引入,所以只能在Android4.4系统中才能使用,提供在当前页面显示上下文中异步执行javascript代码
注意: 这个方法必须在UI线程调用,这个函数的回调也会在UI线程执行。那么在Android4.4一下如何执行javascrit代码呢?能够经过 WebView提供的loadUrl方法:具体格式以下:
webView.loadUrl("javascript:alert(injectedObject.toString())");
其中javascript: 是执行javascript代码的标识 , 后面是javascript语句。
public void removeJavascriptInterface (String name)
删除addJavascripInterface时对webview注入的java对象. 此方法在不一样的Android系统WebView会有问题,会存在失效状况。
public void findAllAsync (String find)
异步执行查找网页内包含的字符并设置高亮,查找结果会回调.
public void findNext (boolean forward)
查找下一个匹配的字符
public void setWebChromeClient (WebChromeClient client)
主要通知客户端app加载当前网页的 title,Favicon,progress,javascript dialog等事件,通知客户端处理这些相应的事件。
public void setWebViewClient (WebViewClient client)
主要通知客户端app加载当前网页时的各类时机状态,onPageStart,onPageFinish,onReceiveError等事件。
WebView 作为承载网页的载体控件,他在网页显示的过程当中会产生一些事件,并回调给咱们的应用程序,以便咱们在网页加载过程当中作应用程序想处理的事情。好比说客户端须要显示网页加载的进度、网页加载发生错误等等事件。 WebView提供两个事件回调类给应用层,分别为WebViewClient,WebChromeClient开发者能够继承这两个类,接手相应事件处理。WebViewClient 主要提供网页加载各个阶段的通知,好比网页开始加载onPageStarted,网页结束加载onPageFinished等;WebChromeClient主要提供网页加载过程当中提供的数据内容,好比返回网页的title。
--WebViewClient使用
webview.setWebViewClient(new WebViewClient () { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { // TODO } @Override public void onPageFinished(WebView view, String url) { // TODO } });
--WebViewClient API详解
public boolean shouldOverrideUrlLoading(WebView view, String url)
public void onPageStarted(WebView view, String url, Bitmap favicon)
public void onPageFinished(WebView view, String url)
public void onLoadResource(WebView view, String url)
public WebResourceResponse shouldInterceptRequest(WebView view, String url)
通知应用程序内核即将加载url制定的资源,应用程序能够返回本地的资源提供给内核,若本地处理返回数据,内核不从网络上获取数据。
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
public void onFormResubmission(WebView view, Message dontResend, Message resend)
public void doUpdateVisitedHistory(WebView view, String url, boolean isReload)
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm)
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event)
提供应用程序同步一个处理按键事件的机会,菜单快捷键须要被过滤掉。若是返回true,webview不处理该事件,若是返回false, webview会一直处理这个事件,所以在view 链上没有一个父类能够响应到这个事件。默认行为是return false;
public void onScaleChanged(WebView view, float oldScale, float newScale)
--webChromeClient使用
webView.setWebChromeClient(new WebChromeClient() {});
public void onProgressChanged(WebView view, int newProgress)
public void onReceivedTitle(WebView view, String title)
public void onReceivedIcon(WebView view, Bitmap icon)
public void onShowCustomView(View view, CustomViewCallback callback)
通知应用程序webview须要显示一个custom view,主要是用在视频全屏HTML5Video support。
public void onHideCustomView()
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg)
public void onRequestFocus(WebView view)
public void onCloseWindow(WebView window)
public boolean onJsAlert(WebView view, String url, String message, JsResult result)
通知应用程序显示javascript alert对话框,若是应用程序返回true内核认为应用程序处理这个消息,返回false,内核本身处理。
public boolean onJsConfirm(WebView view, String url, String message, JsResult result)
public boolean onJsBeforeUnload(WebView view, String url, String message, JsResult result)
public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture)
public synchronized void setLoadsImagesAutomatically(boolean flag)
设置当前webview是否须要加载图片,这个标记控制整个webview的状态,而且对全部的资源都采起这种策略。若是设置为false 那么访问的当前网址中的因此图片资源将不会被加载。默认值是true;经过配置这个方法的标志,能够实现浏览器的无图模式和有图模式的控制。
public synchronized void setBlockNetworkImage (boolean flag)
public void setCacheMode(int mode)
public synchronized void setLayoutAlgorithm(LayoutAlgorithm l)
NORMAL:正常显示,没有渲染变化。
SINGLE_COLUMN:把全部内容放到WebView组件等宽的一列中。 //这个是强制的,把网页都挤变形了(基本不推荐使用)
NARROW_COLUMNS:可能的话,使全部列的宽度不超过屏幕宽度。 //默认的
TEXT_AUTOSIZING: 这个在API 19及以后才能使用,目前不须要了解和使用.
public void setLoadWithOverviewMode(boolean overview)
public synchronized void setJavaScriptEnabled (boolean flag)
覆写WebViewClient中的onReceivedError()方法:
/** * 显示自定义错误提示页面,用一个View覆盖在WebView */ protected void showErrorPage() { LinearLayout webParentView = (LinearLayout)mWebView.getParent(); initErrorPage(); while (webParentView.getChildCount() > 1) { webParentView.removeViewAt(0); } LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT); webParentView.addView(mErrorView, 0, lp); mIsErrorPage = true; } protected void hideErrorPage() { LinearLayout webParentView = (LinearLayout)mWebView.getParent(); mIsErrorPage = false; while (webParentView.getChildCount() > 1) { webParentView.removeViewAt(0); } } protected void initErrorPage() { if (mErrorView == null) { mErrorView = View.inflate(this, R.layout.online_error, null); Button button = (Button)mErrorView.findViewById(R.id.online_error_btn_retry); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { mWebView.reload(); } }); mErrorView.setOnClickListener(null); } } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { mErrorView.setVisibility(View.VISIBLE); super.onReceivedError(view, errorCode, description, failingUrl); } =
CookieSyncManager.createInstance(this); CookieSyncManager.getInstance().startSync(); CookieManager.getInstance().removeSessionCookie();
webView.clearCache(true); webView.clearHistory();
mWebView.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { return true; } });
mWebView.getSettings().setSupportZoom(true); mWebView.getSettings().setBuiltInZoomControls(true); if (DeviceUtils.hasHoneycomb()) { mWebView.getSettings().setDisplayZoomControls(false);
}