九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
史上最全WebView使用,附送Html5Activity一份

如果本文幫助到你,本人不勝榮幸,如果浪費了你的時間,本人深感抱歉。
希望用最簡單的大白話來幫助那些像我一樣的人。如果有什么錯誤,請一定指出,以免誤導(dǎo)大家、也誤導(dǎo)我。
本文來自:http://www.jianshu.com/users/320f9e8f7fc9/latest_articles
感謝您的關(guān)注。

WebView在現(xiàn)在的項目中使用的頻率應(yīng)該還是非常高的。
我個人總覺得HTML5是一種趨勢。找了一些東西,在此總結(jié)。
本篇最后有一個非常不錯 的 Html5Activity 加載類,不想看的可以直接跳下載。

WebSettings

WebSettings webSettings = mWebView .getSettings();//支持獲取手勢焦點,輸入用戶名、密碼或其他webview.requestFocusFromTouch();setJavaScriptEnabled(true);  //支持jssetPluginsEnabled(true);  //支持插件 設(shè)置自適應(yīng)屏幕,兩者合用setUseWideViewPort(true);  //將圖片調(diào)整到適合webview的大小 setLoadWithOverviewMode(true); // 縮放至屏幕的大小setSupportZoom(true);  //支持縮放,默認(rèn)為true。是下面那個的前提。setBuiltInZoomControls(true); //設(shè)置內(nèi)置的縮放控件。  若上面是false,則該WebView不可縮放,這個不管設(shè)置什么都不能縮放。setDisplayZoomControls(false); //隱藏原生的縮放控件setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //支持內(nèi)容重新布局  supportMultipleWindows();  //多窗口 setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);  //關(guān)閉webview中緩存 setAllowFileAccess(true);  //設(shè)置可以訪問文件 setNeedInitialFocus(true); //當(dāng)webview調(diào)用requestFocus時為webview設(shè)置節(jié)點setJavaScriptCanOpenWindowsAutomatically(true); //支持通過JS打開新窗口 setLoadsImagesAutomatically(true);  //支持自動加載圖片setDefaultTextEncodingName("utf-8");//設(shè)置編碼格式




加載方式

加載一個網(wǎng)頁:
webView.loadUrl("http://www.google.com/");
加載apk包中的一個html頁面
webView.loadUrl("file:///android_asset/test.html");
加載手機本地的一個html頁面的方法:
webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");




WebViewClient

WebViewClient就是幫助WebView處理各種通知、請求事件的。
打開網(wǎng)頁時不調(diào)用系統(tǒng)瀏覽器, 而是在本W(wǎng)ebView中顯示:

 mWebView.setWebViewClient(new WebViewClient(){      @Override      public boolean shouldOverrideUrlLoading(WebView view, String url) {          view.loadUrl(url);      return true;      }  });

WebViewClient 方法

WebViewClient mWebViewClient = new WebViewClient()  {      shouldOverrideUrlLoading(WebView view, String url)  最常用的,比如上面的。    //在網(wǎng)頁上的所有加載都經(jīng)過這個方法,這個函數(shù)我們可以做很多操作。    //比如獲取url,查看url.contains(“add”),進行添加操作    shouldOverrideKeyEvent(WebView view, KeyEvent event)    //重寫此方法才能夠處理在瀏覽器中的按鍵事件。     onPageStarted(WebView view, String url, Bitmap favicon)     //這個事件就是開始載入頁面調(diào)用的,我們可以設(shè)定一個loading的頁面,告訴用戶程序在等待網(wǎng)絡(luò)響應(yīng)。     onPageFinished(WebView view, String url)    //在頁面加載結(jié)束時調(diào)用。同樣道理,我們可以關(guān)閉loading 條,切換程序動作。     onLoadResource(WebView view, String url)     // 在加載頁面資源時會調(diào)用,每一個資源(比如圖片)的加載都會調(diào)用一次。     onReceivedError(WebView view, int errorCode, String description, String failingUrl)    // (報告錯誤信息)     doUpdateVisitedHistory(WebView view, String url, boolean isReload)      //(更新歷史記錄)     onFormResubmission(WebView view, Message dontResend, Message resend)     //(應(yīng)用程序重新請求網(wǎng)頁數(shù)據(jù))     onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host,String realm)    //(獲取返回信息授權(quán)請求)     onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)     //重寫此方法可以讓webview處理https請求。    onScaleChanged(WebView view, float oldScale, float newScale)     // (WebView發(fā)生改變時調(diào)用)     onUnhandledKeyEvent(WebView view, KeyEvent event)     //(Key事件未被加載時調(diào)用) }

將上面定義的WebViewClient設(shè)置給WebView:

  webView.setWebViewClient(webViewClient);




WebChromeClient

WebChromeClient是輔助WebView處理Javascript的對話框,網(wǎng)站圖標(biāo),網(wǎng)站title,加載進度等 :
方法中的代碼都是由Android端自己處理。

WebChromeClient mWebChromeClient = new WebChromeClient() {    //獲得網(wǎng)頁的加載進度,顯示在右上角的TextView控件中    @Override    public void onProgressChanged(WebView view, int newProgress) {        if (newProgress < 100) {            String progress = newProgress + "%";        } else {        }    }    //獲取Web頁中的title用來設(shè)置自己界面中的title    //當(dāng)加載出錯的時候,比如無網(wǎng)絡(luò),這時onReceiveTitle中獲取的標(biāo)題為 找不到該網(wǎng)頁,    //因此建議當(dāng)觸發(fā)onReceiveError時,不要使用獲取到的title    @Override    public void onReceivedTitle(WebView view, String title) {        MainActivity.this.setTitle(title);    }    @Override    public void onReceivedIcon(WebView view, Bitmap icon) {        //    }    @Override    public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {        //        return true;    }    @Override    public void onCloseWindow(WebView window) {    }    //處理alert彈出框,html 彈框的一種方式    @Override    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {        //        return true;    }    //處理confirm彈出框    @Override    public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult             result) {        //        return true;    }    //處理prompt彈出框    @Override    public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {        //        return true;    }};

同樣,將上面定義的WebChromeClient設(shè)置給WebView:

  webView.setWebChromeClient(mWebChromeClient);




調(diào)用JS代碼

  WebSettings webSettings = mWebView .getSettings();   webSettings.setJavaScriptEnabled(true);   mWebView.addJavascriptInterface(getHtmlObject(), "jsObj");

上面這是前提!?。?/strong>
然后實現(xiàn)上面的方法。

private Object getHtmlObject(){    Object insertObj = new Object(){        //給html提供的方法,js中可以通過:var str = window.jsObj.HtmlcallJava(); 獲取到        public String HtmlcallJava(){            return "Html call Java";        }        //給html提供的有參函數(shù) : window.jsObj.HtmlcallJava2("IT-homer blog");        public String HtmlcallJava2(final String param){            return "Html call Java : " + param;        }        //Html給我們提供的函數(shù)        public void JavacallHtml(){            runOnUiThread(new Runnable() {                @Override                public void run() {                    //這里是調(diào)用方法                    mWebView.loadUrl("javascript: showFromHtml()");                    Toast.makeText(JSAndroidActivity.this, "clickBtn", Toast.LENGTH_SHORT).show();                }            });        }        //Html給我們提供的有參函數(shù)        public void JavacallHtml2(final String param){            runOnUiThread(new Runnable() {                @Override                public void run() {                    mWebView.loadUrl("javascript: showFromHtml2('IT-homer blog')");                    Toast.makeText(JSAndroidActivity.this, "clickBtn2", Toast.LENGTH_SHORT).show();                }            });        }    };    return insertObj;}

Android 調(diào)用js有個漏洞:
http://blog.csdn.net/leehong2005/article/details/11808557




WebView的方法

前進、后退

goBack ()  //后退goForward ()//前進goBackOrForward (int steps) //以當(dāng)前的index為起始點前進或者后退到歷史記錄中指定的steps,                                如果steps為負(fù)數(shù)則為后退,正數(shù)則為前進canGoForward ()  //是否可以前進canGoBack () //是否可以后退

清除緩存數(shù)據(jù):

clearCache(true);   //清除網(wǎng)頁訪問留下的緩存,由于內(nèi)核緩存是全局的因此這個方法不僅僅針對webview而是針對整個應(yīng)用程序.clearHistory ()  //清除當(dāng)前webview訪問的歷史記錄,只會webview訪問歷史記錄里的所有記錄除了當(dāng)前訪問記錄.clearFormData ()  //這個api僅僅清除自動完成填充的表單數(shù)據(jù),并不會清除WebView存儲到本地的數(shù)據(jù)。

WebView的狀態(tài):

onResume ()  //激活WebView為活躍狀態(tài),能正常執(zhí)行網(wǎng)頁的響應(yīng)onPause ()  //當(dāng)頁面被失去焦點被切換到后臺不可見狀態(tài),需要執(zhí)行onPause動過, onPause動作通知內(nèi)核暫停所有的動作,比如DOM的解析、plugin的執(zhí)行、JavaScript執(zhí)行。pauseTimers () //當(dāng)應(yīng)用程序被切換到后臺我們使用了webview, 這個方法不僅僅針對當(dāng)前的webview而是全局的全應(yīng)用程序的webview,它會暫停所有webview的layout,parsing,javascripttimer。降低CPU功耗。resumeTimers ()  //恢復(fù)pauseTimers時的動作。destroy () //銷毀,關(guān)閉了Activity時,音樂或視頻,還在播放。就必須銷毀。

但是注意:
webview調(diào)用destory時,webview仍綁定在Activity上.這是由于自定義webview構(gòu)建時傳入了該Activity的context對象,因此需要先從父容器中移除webview,然后再銷毀webview:

  rootLayout.removeView(webView);    webView.destroy();

判斷WebView是否已經(jīng)滾動到頁面底端 或者 頂端:
getScrollY() //方法返回的是當(dāng)前可見區(qū)域的頂端距整個頁面頂端的距離,也就是當(dāng)前內(nèi)容滾動的距離.
getHeight()或者getBottom() //方法都返回當(dāng)前WebView 這個容器的高度
getContentHeight() 返回的是整個html 的高度,但并不等同于當(dāng)前整個頁面的高度,因為WebView 有縮放功能, 所以當(dāng)前整個頁面的高度實際上應(yīng)該是原始html 的高度再乘上縮放比例. 因此,更正后的結(jié)果,準(zhǔn)確的判斷方法應(yīng)該是:

    if (webView.getContentHeight() * webView.getScale() == (webView.getHeight() + webView.getScrollY())) {        //已經(jīng)處于底端    }    if(webView.getScrollY() == 0){        //處于頂端    }




返回鍵

返回上一次瀏覽的頁面

public boolean onKeyDown(int keyCode, KeyEvent event) {           if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {               mWebView.goBack();               return true;           }           return super.onKeyDown(keyCode, event);       }




有一個非常不錯的 Html5Activity 加載類帖出來:

package com.lyl.web;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.KeyEvent;import android.webkit.GeolocationPermissions;import android.webkit.WebChromeClient;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;import com.lyl.test.R;public class Html5Activity extends AppCompatActivity {    private String mUrl;    private WebView mWebView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_web);        Bundle bundle = getIntent().getBundleExtra("bundle");        mUrl = bundle.getString("url");        Log.d("Url:", mUrl);        mWebView = (WebView) findViewById(R.id.web);        WebSettings mWebSettings = mWebView.getSettings();        mWebSettings.setSupportZoom(true);        mWebSettings.setLoadWithOverviewMode(true);        mWebSettings.setUseWideViewPort(true);        mWebSettings.setDefaultTextEncodingName("utf-8");        mWebSettings.setLoadsImagesAutomatically(true);        //調(diào)用JS方法.安卓版本大于17,加上注解 @JavascriptInterface        mWebSettings.setJavaScriptEnabled(true);        saveData(mWebSettings);        newWin(mWebSettings);        mWebView.setWebChromeClient(webChromeClient);        mWebView.setWebViewClient(webViewClient);        mWebView.loadUrl(mUrl);    }    /**     * 多窗口的問題     */    private void newWin(WebSettings mWebSettings) {        //html中的_bank標(biāo)簽就是新建窗口打開,有時會打不開,需要加以下        //然后 復(fù)寫 WebChromeClient的onCreateWindow方法        mWebSettings.setSupportMultipleWindows(true);        mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);    }    /**     * HTML5數(shù)據(jù)存儲     */    private void saveData(WebSettings mWebSettings) {        //有時候網(wǎng)頁需要自己保存一些關(guān)鍵數(shù)據(jù),Android WebView 需要自己設(shè)置        mWebSettings.setDomStorageEnabled(true);        mWebSettings.setDatabaseEnabled(true);        mWebSettings.setAppCacheEnabled(true);        String appCachePath = getApplicationContext().getCacheDir().getAbsolutePath();        mWebSettings.setAppCachePath(appCachePath);    }    WebViewClient webViewClient = new WebViewClient(){        /**         * 多頁面在同一個WebView中打開,就是不新建activity或者調(diào)用系統(tǒng)瀏覽器打開         */        @Override        public boolean shouldOverrideUrlLoading(WebView view, String url) {            view.loadUrl(url);            return true;        }    };    WebChromeClient webChromeClient = new WebChromeClient() {        //=========HTML5定位==========================================================        //需要先加入權(quán)限        //<uses-permission android:name="android.permission.INTERNET"/>        //<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>        //<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>        @Override        public void onReceivedIcon(WebView view, Bitmap icon) {            super.onReceivedIcon(view, icon);        }        @Override        public void onGeolocationPermissionsHidePrompt() {            super.onGeolocationPermissionsHidePrompt();        }        @Override        public void onGeolocationPermissionsShowPrompt(final String origin, final GeolocationPermissions.Callback callback) {            callback.invoke(origin, true, false);//注意個函數(shù),第二個參數(shù)就是是否同意定位權(quán)限,第三個是是否希望內(nèi)核記住            super.onGeolocationPermissionsShowPrompt(origin, callback);        }        //=========HTML5定位==========================================================        //=========多窗口的問題==========================================================        @Override        public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {            WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;            transport.setWebView(mWebView);            resultMsg.sendToTarget();            return true;        }        //=========多窗口的問題==========================================================    };    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) {            mWebView.goBack();            return true;        }        return super.onKeyDown(keyCode, event);    }}

原諒我,忘了出自哪里,如果侵權(quán)請聯(lián)系我,一定刪除。
這是下載地址:http://yun.baidu.com/s/1eQWFDvG

覺得不錯的點個喜歡唄,要是直接贊賞的話,那真是太榮幸了。

參考鏈接:
Android webview使用詳解
Android WebView 開發(fā)詳解(一)
還有一些零散的鏈接。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服