整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Android webview加載三種不同位置html的方式

          天在調試android webview加載本地html文件時,對三種不同位置html的加載方式總結如下:

          1.//打開本包內asset目錄下的index.html文件

          wView.loadUrl(" file:///android_asset/index.html ");

          2.//打開本地sd卡內的index.html文件

          wView.loadUrl("content://com.android.htmlfileprovider/sdcard/index.html");

          3.//打開指定URL的html文件

          wView.loadUrl(" http://m.oschina.net");

          今天就分享這一個知識點,祝大家好運!

          • 現在很多App里都內置了Web網頁(Hybrid App),比如說很多電商平臺,淘寶、京東、聚劃算等等,如下圖

          • 上述功能是由Android的WebView實現的,其中涉及到Android客戶端與Web網頁交互的實現
          • 今天我將全面介紹Android通過WebView與JS交互的全面方式

          閱讀本文前請先閱讀:Android開發:最全面、最易懂的Webview詳解


          目錄


          1. 交互方式總結

          Android與JS通過WebView互相調用方法,實際上是:

          • Android去調用JS的代碼
          • JS去調用Android的代碼

          二者溝通的橋梁是WebView

          對于Android調用JS代碼的方法有2種:

          1. 通過WebView的loadUrl()

          2. 通過WebView的evaluateJavascript()

          對于JS調用Android代碼的方法有3種:

          1. 通過WebView的addJavascriptInterface()進行對象映射

          2. 通過 WebViewClient 的shouldOverrideUrlLoading ()方法回調攔截 url

          3. 通過 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回調攔截JS對話框alert()、confirm()、prompt() 消息


          2. 具體分析

          2.1 Android通過WebView調用 JS 代碼

          對于Android調用JS代碼的方法有2種:

          1. 通過WebView的loadUrl()

          2. 通過WebView的evaluateJavascript()

          方式1:通過WebView的loadUrl()

          • 實例介紹:點擊Android按鈕,即調用WebView JS(文本名為javascript)中callJS()
          • 具體使用:

          步驟1:將需要調用的JS代碼以.html格式放到src/main/assets文件夾里

          • 為了方便展示,本文是采用Andorid調用本地JS代碼說明;
          • 實際情況時,Android更多的是調用遠程JS代碼,即將加載的JS代碼路徑改成url即可

          需要加載JS代碼:javascript.html

          // 文本名:javascript

          <!DOCTYPE html>

          <html>

          <head>

          <meta charset="utf-8">

          <title>Carson_Ho</title>

          // JS代碼

          <script>

          // Android需要調用的方法

          function callJS(){

          alert("Android調用了JS的callJS方法");

          }

          </script>

          </head>

          </html>

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19

          步驟2:在Android里通過WebView設置調用JS代碼

          Android代碼:MainActivity.java

          注釋已經非常清楚

          public class MainActivity extends AppCompatActivity {

          WebView mWebView;

          Button button;

          @Override

          protected void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);

          setContentView(R.layout.activity_main);

          mWebView =(WebView) findViewById(R.id.webview);

          WebSettings webSettings = mWebView.getSettings();

          // 設置與Js交互的權限

          webSettings.setJavaScriptEnabled(true);

          // 設置允許JS彈窗

          webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

          // 先載入JS代碼

          // 格式規定為:file:///android_asset/文件名.html

          mWebView.loadUrl("file:///android_asset/javascript.html");

          button = (Button) findViewById(R.id.button);

          button.setOnClickListener(new View.OnClickListener() {

          @Override

          public void onClick(View v) {

          // 通過Handler發送消息

          mWebView.post(new Runnable() {

          @Override

          public void run() {

          // 注意調用的JS方法名要對應上

          // 調用javascript的callJS()方法

          mWebView.loadUrl("javascript:callJS()");

          }

          });

          }

          });

          // 由于設置了彈窗檢驗調用結果,所以需要支持js對話框

          // webview只是載體,內容的渲染需要使用webviewChromClient類去實現

          // 通過設置WebChromeClient對象處理JavaScript的對話框

          //設置響應js 的Alert()函數

          mWebView.setWebChromeClient(new WebChromeClient() {

          @Override

          public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {

          AlertDialog.Builder b = new AlertDialog.Builder(MainActivity.this);

          b.setTitle("Alert");

          b.setMessage(message);

          b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {

          @Override

          public void onClick(DialogInterface dialog, int which) {

          result.confirm();

          }

          });

          b.setCancelable(false);

          b.create().show();

          return true;

          }

          });

          }

          }

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35
          • 36
          • 37
          • 38
          • 39
          • 40
          • 41
          • 42
          • 43
          • 44
          • 45
          • 46
          • 47
          • 48
          • 49
          • 50
          • 51
          • 52
          • 53
          • 54
          • 55
          • 56
          • 57
          • 58
          • 59
          • 60
          • 61
          • 62
          • 63
          • 64
          • 65
          • 66
          • 67
          • 68
          • 69

          特別注意:JS代碼調用一定要在 onPageFinished() 回調之后才能調用,否則不會調用。

          onPageFinished()屬于WebViewClient類的方法,主要在頁面加載結束時調用

          方式2:通過WebView的evaluateJavascript()

          • 優點:該方法比第一種方法效率更高、使用更簡潔。
          • 因為該方法的執行不會使頁面刷新,而第一種方法(loadUrl )的執行則會。
          • Android 4.4 后才可使用
          • 具體使用

          // 只需要將第一種方法的loadUrl()換成下面該方法即可

          mWebView.evaluateJavascript("javascript:callJS()", new ValueCallback<String>() {

          @Override

          public void onReceiveValue(String value) {

          //此處為 js 返回的結果

          }

          });

          }

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8

          2.1.2 方法對比

          2.1.3 使用建議

          兩種方法混合使用,即Android 4.4以下使用方法1,Android 4.4以上方法2

          // Android版本變量

          final int version = Build.VERSION.SDK_INT;

          // 因為該方法在 Android 4.4 版本才可使用,所以使用時需進行版本判斷

          if (version < 18) {

          mWebView.loadUrl("javascript:callJS()");

          } else {

          mWebView.evaluateJavascript("javascript:callJS()", new ValueCallback<String>() {

          @Override

          public void onReceiveValue(String value) {

          //此處為 js 返回的結果

          }

          });

          }

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13

          2.2 JS通過WebView調用 Android 代碼

          對于JS調用Android代碼的方法有3種:

          1. 通過WebView的addJavascriptInterface()進行對象映射

          2. 通過 WebViewClient 的shouldOverrideUrlLoading ()方法回調攔截 url

          3. 通過 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回調攔截JS對話框alert()、confirm()、prompt() 消息

          2.2.1 方法分析

          方式1:通過 WebView的addJavascriptInterface()進行對象映射

          步驟1:定義一個與JS對象映射關系的Android類:AndroidtoJs

          AndroidtoJs.java(注釋已經非常清楚)

          // 繼承自Object類

          public class AndroidtoJs extends Object {

          // 定義JS需要調用的方法

          // 被JS調用的方法必須加入@JavascriptInterface注解

          @JavascriptInterface

          public void hello(String msg) {

          System.out.println("JS調用了Android的hello方法");

          }

          }

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10

          步驟2:將需要調用的JS代碼以.html格式放到src/main/assets文件夾里

          需要加載JS代碼:javascript.html

          <!DOCTYPE html>

          <html>

          <head>

          <meta charset="utf-8">

          <title>Carson</title>

          <script>

          function callAndroid(){

          // 由于對象映射,所以調用test對象等于調用Android映射的對象

          test.hello("js調用了android中的hello方法");

          }

          </script>

          </head>

          <body>

          //點擊按鈕則調用callAndroid函數

          <button type="button" id="button1" onclick="callAndroid()"></button>

          </body>

          </html>

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19

          步驟3:在Android里通過WebView設置Android類與JS代碼的映射

          詳細請看注釋

          public class MainActivity extends AppCompatActivity {

          WebView mWebView;

          @Override

          protected void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);

          setContentView(R.layout.activity_main);

          mWebView = (WebView) findViewById(R.id.webview);

          WebSettings webSettings = mWebView.getSettings();

          // 設置與Js交互的權限

          webSettings.setJavaScriptEnabled(true);

          // 通過addJavascriptInterface()將Java對象映射到JS對象

          //參數1:Javascript對象名

          //參數2:Java對象名

          mWebView.addJavascriptInterface(new AndroidtoJs(), "test");//AndroidtoJS類對象映射到js的test對象

          // 加載JS代碼

          // 格式規定為:file:///android_asset/文件名.html

          mWebView.loadUrl("file:///android_asset/javascript.html");

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24

          特點

          • 優點:使用簡單

          僅將Android對象和JS對象映射即可

          • 缺點:存在嚴重的漏洞問題,具體請看文章:你不知道的 Android WebView 使用漏洞

          方式2:通過 WebViewClient 的方法shouldOverrideUrlLoading ()回調攔截 url

          • 具體原理:
          1. Android通過 WebViewClient 的回調方法shouldOverrideUrlLoading ()攔截 url
          2. 解析該 url 的協議
          3. 如果檢測到是預先約定好的協議,就調用相應方法

          即JS需要調用Android的方法

          • 具體使用:
          • 步驟1:在JS約定所需要的Url協議
          • JS代碼:javascript.html

          以.html格式放到src/main/assets文件夾里

          <!DOCTYPE html>

          <html>

          <head>

          <meta charset="utf-8">

          <title>Carson_Ho</title>

          <script>

          function callAndroid(){

          /*約定的url協議為:js://webview?arg1=111&arg2=222*/

          document.location = "js://webview?arg1=111&arg2=222";

          }

          </script>

          </head>

          <!-- 點擊按鈕則調用callAndroid()方法 -->

          <body>

          <button type="button" id="button1" onclick="callAndroid()">點擊調用Android代碼</button>

          </body>

          </html>

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20

          當該JS通過Android的mWebView.loadUrl("file:///android_asset/javascript.html")加載后,就會回調shouldOverrideUrlLoading (),接下來繼續看步驟2:

          步驟2:在Android通過WebViewClient復寫shouldOverrideUrlLoading ()

          MainActivity.java

          public class MainActivity extends AppCompatActivity {

          WebView mWebView;

          // Button button;

          @Override

          protected void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);

          setContentView(R.layout.activity_main);

          mWebView = (WebView) findViewById(R.id.webview);

          WebSettings webSettings = mWebView.getSettings();

          // 設置與Js交互的權限

          webSettings.setJavaScriptEnabled(true);

          // 設置允許JS彈窗

          webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

          // 步驟1:加載JS代碼

          // 格式規定為:file:///android_asset/文件名.html

          mWebView.loadUrl("file:///android_asset/javascript.html");

          // 復寫WebViewClient類的shouldOverrideUrlLoading方法

          mWebView.setWebViewClient(new WebViewClient() {

          @Override

          public boolean shouldOverrideUrlLoading(WebView view, String url) {

          // 步驟2:根據協議的參數,判斷是否是所需要的url

          // 一般根據scheme(協議格式) & authority(協議名)判斷(前兩個參數)

          //假定傳入進來的 url = "js://webview?arg1=111&arg2=222"(同時也是約定好的需要攔截的)

          Uri uri = Uri.parse(url);

          // 如果url的協議 = 預先約定的 js 協議

          // 就解析往下解析參數

          if ( uri.getScheme().equals("js")) {

          // 如果 authority = 預先約定協議里的 webview,即代表都符合約定的協議

          // 所以攔截url,下面JS開始調用Android需要的方法

          if (uri.getAuthority().equals("webview")) {

          // 步驟3:

          // 執行JS所需要調用的邏輯

          System.out.println("js調用了Android的方法");

          // 可以在協議上帶有參數并傳遞到Android上

          HashMap<String, String> params = new HashMap<>();

          Set<String> collection = uri.getQueryParameterNames();

          }

          return true;

          }

          return super.shouldOverrideUrlLoading(view, url);

          }

          }

          );

          }

          }

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35
          • 36
          • 37
          • 38
          • 39
          • 40
          • 41
          • 42
          • 43
          • 44
          • 45
          • 46
          • 47
          • 48
          • 49
          • 50
          • 51
          • 52
          • 53
          • 54
          • 55
          • 56
          • 57
          • 58
          • 59
          • 60

          特點

          • 優點:不存在方式1的漏洞;
          • 缺點:JS獲取Android方法的返回值復雜。

          如果JS想要得到Android方法的返回值,只能通過 WebView 的 loadUrl ()去執行 JS 方法把返回值傳遞回去,相關的代碼如下:

          // Android:MainActivity.java

          mWebView.loadUrl("javascript:returnResult(" + result + ")");

          // JS:javascript.html

          function returnResult(result){

          alert("result is" + result);

          }

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7

          方式3:通過 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回調攔截JS對話框alert()、confirm()、prompt() 消息

          在JS中,有三個常用的對話框方法:

          方式3的原理:Android通過 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回調分別攔截JS對話框

          (即上述三個方法),得到他們的消息內容,然后解析即可。

          下面的例子將用攔截 JS的輸入框(即prompt()方法)說明 :

          • 常用的攔截是:攔截 JS的輸入框(即prompt()方法)
          • 因為只有prompt()可以返回任意類型的值,操作最全面方便、更加靈活;而alert()對話框沒有返回值;confirm()對話框只能返回兩種狀態(確定 / 取消)兩個值

          步驟1:加載JS代碼,如下:

          javascript.html

          以.html格式放到src/main/assets文件夾里

          <!DOCTYPE html>

          <html>

          <head>

          <meta charset="utf-8">

          <title>Carson_Ho</title>

          <script>

          function clickprompt(){

          // 調用prompt()

          var result=prompt("js://demo?arg1=111&arg2=222");

          alert("demo " + result);

          }

          </script>

          </head>

          <!-- 點擊按鈕則調用clickprompt() -->

          <body>

          <button type="button" id="button1" onclick="clickprompt()">點擊調用Android代碼</button>

          </body>

          </html>

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22

          當使用mWebView.loadUrl("file:///android_asset/javascript.html")加載了上述JS代碼后,就會觸發回調onJsPrompt(),具體如下:

          • 如果是攔截警告框(即alert()),則觸發回調onJsAlert();
          • 如果是攔截確認框(即confirm()),則觸發回調onJsConfirm();

          步驟2:在Android通過WebChromeClient復寫onJsPrompt()

          public class MainActivity extends AppCompatActivity {

          WebView mWebView;

          // Button button;

          @Override

          protected void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);

          setContentView(R.layout.activity_main);

          mWebView = (WebView) findViewById(R.id.webview);

          WebSettings webSettings = mWebView.getSettings();

          // 設置與Js交互的權限

          webSettings.setJavaScriptEnabled(true);

          // 設置允許JS彈窗

          webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

          // 先加載JS代碼

          // 格式規定為:file:///android_asset/文件名.html

          mWebView.loadUrl("file:///android_asset/javascript.html");

          mWebView.setWebChromeClient(new WebChromeClient() {

          // 攔截輸入框(原理同方式2)

          // 參數message:代表promt()的內容(不是url)

          // 參數result:代表輸入框的返回值

          @Override

          public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {

          // 根據協議的參數,判斷是否是所需要的url(原理同方式2)

          // 一般根據scheme(協議格式) & authority(協議名)判斷(前兩個參數)

          //假定傳入進來的 url = "js://webview?arg1=111&arg2=222"(同時也是約定好的需要攔截的)

          Uri uri = Uri.parse(message);

          // 如果url的協議 = 預先約定的 js 協議

          // 就解析往下解析參數

          if ( uri.getScheme().equals("js")) {

          // 如果 authority = 預先約定協議里的 webview,即代表都符合約定的協議

          // 所以攔截url,下面JS開始調用Android需要的方法

          if (uri.getAuthority().equals("webview")) {

          //

          // 執行JS所需要調用的邏輯

          System.out.println("js調用了Android的方法");

          // 可以在協議上帶有參數并傳遞到Android上

          HashMap<String, String> params = new HashMap<>();

          Set<String> collection = uri.getQueryParameterNames();

          //參數result:代表消息框的返回值(輸入值)

          result.confirm("js調用了Android的方法成功啦");

          }

          return true;

          }

          return super.onJsPrompt(view, url, message, defaultValue, result);

          }

          // 通過alert()和confirm()攔截的原理相同,此處不作過多講述

          // 攔截JS的警告框

          @Override

          public boolean onJsAlert(WebView view, String url, String message, JsResult result) {

          return super.onJsAlert(view, url, message, result);

          }

          // 攔截JS的確認框

          @Override

          public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {

          return super.onJsConfirm(view, url, message, result);

          }

          }

          );

          }

          }

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35
          • 36
          • 37
          • 38
          • 39
          • 40
          • 41
          • 42
          • 43
          • 44
          • 45
          • 46
          • 47
          • 48
          • 49
          • 50
          • 51
          • 52
          • 53
          • 54
          • 55
          • 56
          • 57
          • 58
          • 59
          • 60
          • 61
          • 62
          • 63
          • 64
          • 65
          • 66
          • 67
          • 68
          • 69
          • 70
          • 71
          • 72
          • 73
          • 74
          • 75
          • 76
          • 77
          • 78

          • Demo地址
          • 上述所有代碼均存放在:Carson_Ho的Github地址 : WebView Demo

          2.2.2 三種方式的對比 & 使用場景


          3. 總結

          • 本文主要對Android通過WebView與JS的交互方式進行了全面介紹

          • 關于WebView的系列文章對你有所幫助
          • Android開發:最全面、最易懂的Webview詳解
          • Android:你不知道的 WebView 使用漏洞
          • 手把手教你構建 Android WebView 的緩存機制 & 資源預加載方案
          • 接下來我會繼續講解其他安卓開發的知識,有興趣可以繼續關注Carson_Ho的安卓開發筆記!!!!

          請評論點贊!因為你們的贊同/鼓勵是我寫作的最大動力!

          ebView 加載判斷 和 加載動畫的簡單實現

          WebView 在加載網頁時候,在網絡不好的情況下,如果不做處理會出現一段時間的等待空白,用戶體驗差。所以有必要加上一個簡單的加載進度提示。本編簡單的運用了ProgressDialog 這個控件來實現。

          下面是簡單的代碼片段


          1. <span style="color:#ff6666;"><</span>?xml version="1.0" encoding="utf-8"?>
          2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          3. android:layout_width="match_parent"
          4. android:layout_height="match_parent"
          5. android:orientation="vertical">
          6. <android.support.v7.widget.Toolbar
          7. android:background="@color/colorPrimaryDark"
          8. android:popupTheme="@style/AppTheme.PopupOverlay"
          9. android:layout_width="match_parent"
          10. android:layout_height="wrap_content"
          11. android:minHeight="?attr/actionBarSize"
          12. >
          13. <ImageView
          14. android:id="@+id/faq_activity_back"
          15. android:layout_width="wrap_content"
          16. android:layout_height="wrap_content"
          17. android:src="@mipmap/back"/>
          18. <TextView
          19. android:id="@+id/faq_activity_title"
          20. android:layout_width="wrap_content"
          21. android:layout_height="wrap_content"
          22. android:layout_gravity="center_horizontal"
          23. android:textColor="@color/white"
          24. android:textSize="22sp"
          25. android:text="常見問題"
          26. />
          27. </android.support.v7.widget.Toolbar>
          28. <WebView
          29. android:id="@+id/faq_webview"
          30. android:layout_width="match_parent"
          31. android:layout_height="match_parent" />
          32. </LinearLayout>
          1. 下面貼上部分代碼
          2. public class FAQActivity extends BaseActivity {
          3. private final String TAG = FAQActivity.class.getName();
          4. @BindView(R.id.activity_fap_back)
          5. ImageView activityFapBack;
          6. @BindView(R.id.activity_faq_webview)
          7. WebView webView;
          8. private String FAQ_BASE_URL = "";
          9. /***
          10. *
          11. * @param savedInstanceState
          12. */
          13. @Override
          14. protected void onCreate(Bundle savedInstanceState) {
          15. super.onCreate(savedInstanceState);
          16. setContentView(R.layout.activity_faq);
          17. ButterKnife.bind(this);
          18. init();
          19. }
          20. private void init() {
          21. webView.loadUrl("你的請求地址");
          22. WebSettings mWebSettings = webView.getSettings();
          23. mWebSettings.setSupportZoom(true);
          24. mWebSettings.setLoadWithOverviewMode(true);
          25. mWebSettings.setUseWideViewPort(true);
          26. mWebSettings.setDefaultTextEncodingName("GBK");//設置解碼格式
          27. mWebSettings.setLoadsImagesAutomatically(true);
          28. mWebSettings.setJavaScriptEnabled(true);//支持js 特效
          29. //覆蓋WebView默認使用第三方或系統默認瀏覽器打開網頁的行為,使網頁用WebView打開
          30. webView.setWebViewClient(new WebViewClient() {
          31. @Override
          32. public boolean shouldOverrideUrlLoading(WebView view, String url) {
          33. // TODO Auto-generated method stub
          34. //返回值是true的時候控制去WebView打開,為false調用系統瀏覽器或第三方瀏覽器
          35. view.loadUrl(url);
          36. return true;
          37. }
          38. @Override
          39. public void onPageStarted(WebView view, String url, Bitmap favicon) {
          40. super.onPageStarted(view, url, favicon);
          41. showProgress("頁面加載中");//開始加載動畫
          42. }
          43. @Override
          44. public void onPageFinished(WebView view, String url) {
          45. super.onPageFinished(view, url);
          46. removeProgress();//當加載結束時移除動畫
          47. }
          48. });
          49. }
          50. /**
          51. * 點擊事件
          52. */
          53. @OnClick(R.id.activity_fap_back)
          54. public void onClick() {
          55. Log.d(TAG, "onClick: ");
          56. jumpToActivity(FAQActivity.this,MenuActivity.class);
          57. }
          58. /**
          59. * 返回鍵的監聽事件
          60. *
          61. * @param keyCode
          62. * @param event
          63. * @return
          64. */
          65. public boolean onKeyDown(int keyCode, KeyEvent event) {
          66. if (keyCode == KeyEvent.KEYCODE_BACK) {
          67. jumpToActivity(FAQActivity.this,MenuActivity.class);
          68. }
          69. return false;
          70. }
          71. }

          需要注意的地方:ProgressDIalog 控件為了不寫重復代碼,我進行了簡單的封裝。下面是我簡單封裝的BaseActivity代碼


          1. public class BaseActivity extends AppCompatActivity {
          2. private final String TAG = BaseActivity.class.getName();
          3. private Toast toast = null;
          4. private ProgressDialog progressDialog;
          5. @Override
          6. protected void onCreate(@Nullable Bundle savedInstanceState) {
          7. super.onCreate(savedInstanceState);
          8. }
          9. /**
          10. * @param context 上下文對象
          11. * @param start 其實activity
          12. * @param target 目標activity
          13. */
          14. public void jumpToActivity(Context context, Class start, Class target) {
          15. Intent intent = new Intent(context, target);
          16. //------用戶返回上一級activity
          17. if (target == CarFindingActivity.class) {
          18. intent.putExtra("activity", start);
          19. }
          20. context.startActivity(intent);
          21. finish();
          22. }
          23. public void jumpToActivity(Context context, Class target) {
          24. Intent intent = new Intent(context, target);
          25. //------用戶返回上一級activity
          26. context.startActivity(intent);
          27. finish();
          28. }
          29. /**
          30. * @param context
          31. * @param text
          32. */
          33. public void showToastLong(Context context, String text) {
          34. if (toast == null) {
          35. toast = Toast.makeText(context, text, Toast.LENGTH_LONG);
          36. } else {
          37. toast.setText(text);
          38. }
          39. toast.show();
          40. }
          41. public void showToastLong(String text) {
          42. if (toast == null) {
          43. toast = Toast.makeText(BaseActivity.this, text, Toast.LENGTH_LONG);
          44. } else {
          45. toast.setText(text);
          46. }
          47. toast.show();
          48. }
          49. /**
          50. * @param context
          51. * @param text
          52. */
          53. public void showToastShort(Context context, String text) {
          54. if (toast == null) {
          55. toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
          56. } else {
          57. toast.setText(text);
          58. }
          59. toast.show();
          60. }
          61. public void showToastShort(String text) {
          62. if (toast == null) {
          63. toast = Toast.makeText(BaseActivity.this, text, Toast.LENGTH_SHORT);
          64. } else {
          65. toast.setText(text);
          66. }
          67. toast.show();
          68. }
          69. //-----顯示ProgressDialog
          70. public void showProgress(String message) {
          71. if (progressDialog == null) {
          72. progressDialog = new ProgressDialog(BaseActivity.this, ProgressDialog.STYLE_SPINNER);
          73. progressDialog.setCancelable(false);//設置點擊不消失
          74. }
          75. if (progressDialog.isShowing()) {
          76. progressDialog.setMessage(message);
          77. } else {
          78. progressDialog.setMessage(message);
          79. progressDialog.show();
          80. }
          81. }
          82. //------取消ProgressDialog
          83. public void removeProgress(){
          84. if (progressDialog==null){
          85. return;
          86. }
          87. if (progressDialog.isShowing()){
          88. progressDialog.dismiss();
          89. }
          90. }
          91. /**
          92. *
          93. */
          94. @Override
          95. protected void onStart() {
          96. super.onStart();
          97. Log.d(TAG, "onStart: ");
          98. }
          99. @Override
          100. protected void onResume() {
          101. super.onResume();
          102. Log.d(TAG, "onResume: ");
          103. }
          104. @Override
          105. protected void onPause() {
          106. super.onPause();
          107. Log.d(TAG, "onPause: ");
          108. }
          109. @Override
          110. protected void onStop() {
          111. removeProgress();//讓progressdialog 消失
          112. super.onStop();
          113. Log.d(TAG, "onStop: ");
          114. }
          115. @Override
          116. protected void onRestart() {
          117. super.onRestart();
          118. Log.d(TAG, "onRestart: ");
          119. }
          120. @Override
          121. protected void onDestroy() {
          122. super.onDestroy();
          123. Log.d(TAG, "onDestroy: ");
          124. }
          125. }

          然后繼承BaseActivtiy 直接調用里面

          showProgress(String message)

          顯示ProgressDialogremoveProgress()

          移除ProgressDialog以上就這么多,如有錯誤或者不嚴謹的地方懇請指正,謝謝


          主站蜘蛛池模板: 精品无码国产一区二区三区51安| 亚洲一区二区精品视频| 国产成人精品一区二三区在线观看| 91在线视频一区| 无码丰满熟妇浪潮一区二区AV| 日韩精品一区二区亚洲AV观看| 亚洲一区二区三区深夜天堂| 日韩一区二区精品观看| 国产成人AV一区二区三区无码| 亚洲国产视频一区| 国产精品一区二区香蕉| 亚洲国产综合精品一区在线播放| 无码一区二区三区老色鬼| 一区二区三区四区无限乱码| 国产91精品一区二区麻豆亚洲| 亚洲成a人一区二区三区| 无码国产精品一区二区免费式直播 | 久久国产视频一区| 风间由美在线亚洲一区| 亚洲高清美女一区二区三区| 无码人妻久久一区二区三区| 国产a久久精品一区二区三区| 国产免费一区二区视频| 日本一区二区三区不卡在线视频| 精品一区二区三区波多野结衣| 韩国精品一区二区三区无码视频| 日韩人妻精品一区二区三区视频 | 亚洲一区二区三区偷拍女厕| 青娱乐国产官网极品一区| 波多野结衣中文字幕一区| 美女免费视频一区二区| 在线日韩麻豆一区| 一区二区三区午夜| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 国产精品一区二区久久精品无码| aⅴ一区二区三区无卡无码| 天堂Aⅴ无码一区二区三区| 无码一区二区三区在线观看| 精品无码成人片一区二区98| 无码日韩AV一区二区三区| 国产内射在线激情一区|