您好,登錄后才能下訂單哦!
今天小編給大家分享一下android的WebView怎么使用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
使用
一開始相信大家都是直接在布局文件中添加WebView控件,當然我一開始也是這樣做的,就是為了簡單,而且也不知道這樣會出現什么問題。
<WebView android:id="@+id/web_view" android:layout_width="match_parent" android:layout_height="match_parent"/>
直接就這樣添加了一個WebView,發現也沒什么問題啊,一樣可以顯示,什么都是正常的啊。在重復打開有WebView的頁面時,你會發現,應用的內存會不斷升高,銷毀了之后也不會降下來,點擊GC也降不下來,這樣就出現了內存泄漏了,這時你就會發現,這樣使用WebView是不正確的,那么***方式是如何使用呢?
那就是在代碼中動態添加。
首先在布局文件中聲明一個parent布局
<LinearLayout android:id="@+id/web_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:scrollbars="none" />
然后在代碼中,把WebView當做其子View添加進去
WebView webView = new WebView(context); webViewLayout.addView(webView);
網上很多人說這個context應該用application的,我覺得是不對的,如果你的WebView需要彈出一個dialog呢?還有其他的不可預估的問題的,***還是用當前的activity的Context是最合適的。
上面說的是如何把WebView添加進來進行使用,然后到底它有哪些屬性是我們在開發中需要使用到的呢?
webView.loadUrl("www.baidu.com");//WebView加載的網頁使用loadUrl WebSettings webSettings = webView.getSettings();//獲得WebView的設置 webSettings.setUseWideViewPort(true);// 設置此屬性,可任意比例縮放 webSettings.setLoadWithOverviewMode(true);//適配 webSettings.setJavaScriptEnabled(true); //支持js webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); //設置 緩存模式 webSettings.setDomStorageEnabled(true);// 開啟 DOM storage API 功能 webSettings.setDatabaseEnabled(true);//開啟 database storage API 功能 webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);//HTTPS,注意這個是在LOLLIPOP以上才調用的 webSettings.setAppCacheEnabled(true);//開啟 Application Caches 功能 webSettings.setBlockNetworkImage(true);//關閉加載網絡圖片,在一開始加載的時候可以設置為true,當加載完網頁的時候再設置為false
上面是使用WebView中最基礎的設置,相信在開發過程中都會進行如上的設置的。
webView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { //加載的進度 } @Override public void onReceivedTitle(WebView view, String title) { //獲取WebView的標題 } @Override public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { return super.onJsAlert(view, url, message, result); //Js 彈框 } @Override public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { AlertDialog.Builder b = new AlertDialog.Builder(IllegalQueryActivity.this); b.setTitle("刪除"); b.setMessage(message); b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.confirm(); } }); b.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.cancel(); } }); b.create().show(); return true; } }); webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //需要設置在當前WebView中顯示網頁,才不會跳到默認的瀏覽器進行顯示 return true; } @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { super.onReceivedError(view, request, error); //加載出錯了 } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); //加載完成 } }); webView.setDownloadListener(new DownLoadListener());//下載監聽 private class DownLoadListener implements DownloadListener { @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { } }
然后就是WebView跟JS的交互了
webView.addJavascriptInterface(new WebAppInterface(this), "WebJs"); public class WebAppInterface { Context mContext; public WebAppInterface(Context c) { mContext = c; } @JavascriptInterface public void method() { } } webView.loadUrl("javascript:jsMethod()");//這是WebView最簡單的調用JS的方法
當activity執行生命周期的時候,這里需要注意的是在onDestroy的時候,需要銷毀WebView,不然也會出現內存泄漏的。
@Overrideprotected void onPause() { super.onPause(); if (webView != null) { webView.onPause(); } } @Override protected void onResume() { super.onResume(); if (webView != null) { webView.onResume(); } } @Override protected void onDestroy() { if (webView != null) { webView.clearCache(true); //清空緩存 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { if (webViewLayout != null) { webViewLayout.removeView(webView); } webView.removeAllViews(); webView.destroy(); }else { webView.removeAllViews(); webView.destroy(); if (webViewLayout != null) { webViewLayout.removeView(webView); } } webView = null; } }
可以看到上面的onDestroy方法中對系統的版本進行了判斷,那是因為我在不同的版本中進行了測試,如果低于5.0版本的WebView中,如果先在parent中remove了WebView,那WebView將無法進行destroy了,這樣就會造成內存的泄漏,下來你們可以自己去嘗試一下這個說法是不是正確的。
現在還遇到的一個問題就是,當WebView嵌套在ScrollView中時,某些機型會出現閃屏的問題,單獨WebView的時候是不會出現的,把硬件加速關閉了之后,對用戶的體驗又不好,所以暫時還未想到比較好的解決方案,所以還是建議不要在ScrollView中嵌套WebView這樣的控件。
以上就是“android的WebView怎么使用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。