聲明在先:必須在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);
}