標籤:

android webView

Android WebView使用全面解析(載入網路資源、本地HTML,JS交互) - CSDN博客?

blog.csdn.net圖標

簡述:

WebView是什麼?有什麼用途?我們先來看一下官方介紹:

A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some online content within your Activity. It uses the WebKit rendering engine to display web pages and includes methods to navigate forward and backward through a history, zoom in and out, perform text searches and more.

Note that, in order for your Activity to access the Internet and load web pages in a WebView, you must add the INTERNET permissions to your Android Manifest file:

[html] view plain copy

  1. <uses-permission android:name="android.permission.INTERNET" />

大致意思就是說WebView(網路視圖)能載入顯示網頁,可以將其視為一個瀏覽器。在使用的過程中需要加入網路許可權。了解了WebView我們接下來學習一下怎麼使用,本篇博文主要講解以下內容:

① WebView載入網路資源

② WebView載入本地HTML

③ WebView中Android調用JS方法

④ WebView中JS調用Android方法

⑤ HTML5的使用

⑥ JS的簡單使用

WebView載入網路資源

載入網路資源的一般步驟如下:

①在XML文件中引入WebView控制項

②在Activity中創建WebView實例

③對WebView進行必要的設置(根據需要)

④載入網路資源

WebView簡單載入網頁

我們按上述步驟簡單地實現載入百度首頁,首先創建XML文件,就是簡單的在相應Activity頁面中引入WebView控制項,如下:

[html] view plain copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="schemas.android.com/apk"
  3. android:layout_width_="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <WebView
  7. android:id="@+id/local_webview"
  8. android:layout_width_="match_parent"
  9. android:layout_height="match_parent" />
  10. </LinearLayout>

在Activity中創建WebView實例、載入網路資源比較簡單,我對代碼做了比較詳細地注釋,直接上代碼吧。

[html] view plain copy

  1. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  2. private WebView webview;
  3. private Button btn;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. btn = (Button) findViewById(R.id.btn);
  9. //創建WebView實例
  10. webview = (WebView) findViewById(R.id.webview);
  11. btn.setOnClickListener(this);
  12. }
  13. @Override
  14. public void onClick(View v) {
  15. if (R.id.btn != v.getId())
  16. return;
  17. //跳轉到baidu.com頁面
  18. webview.loadUrl("baidu.com");
  19. }
  20. }

效果圖:

改進一:不再跳轉第三方瀏覽器

那麼這樣還是有問題,每次都要啟動第三方瀏覽器來載入網頁,我們能不能只在App內部顯示而不跳轉第三方瀏覽器呢?Google早以想到這樣的情況啦!app內部調用主要利用了方法setWebViewClient(),該方法里相當於在App內部設置一個瀏覽器客戶端,該方法的參數就是一個WebViewClient實例。

代碼如下:

[html] view plain copy

  1. public class WebViewActivity extends Activity {
  2. private WebView webview_in;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.web_activity);
  7. webview_in = (WebView) findViewById(R.id.webview_in);
  8. //web資源
  9. webview_in.loadUrl("baidu.com");
  10. //設置WebViewClient客戶端
  11. webview_in.setWebViewClient(new WebViewClient(){
  12. @Override
  13. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  14. view.loadUrl(url);
  15. return true;
  16. }
  17. });
  18. }
  19. }

效果圖:

改進二:WebView開啟JavaScript功能、按返回鍵網頁後退而不是退出瀏覽器的問題

從上面的gif動態可以看出這次並沒有跳轉到第三方瀏覽器,而是跳轉到一個Activity中(該Activity中只包含一個WebView控制項)。但是也可以很明顯地看出該WebViewClient存在一些問題:

①未開啟JavaScript功能 :該瀏覽器未開啟JavaScript功能(在動態圖中點擊「百度知道 」時可以看出提示);

②按返回鍵網頁後退而不是退出瀏覽器的問題 :當我們在「百度知道 」 頁面點擊返回鍵時並沒有回到百度首頁,而是跳轉出了WebViewActivity。

ok,我們先來解決第一個問題:為WebView開啟JavaScript功能。

核心代碼如下:

[html] view plain copy

  1. /**
  2. * 方法描述:啟用支持javascript
  3. */
  4. private void openJavaScript() {
  5. WebSettings settings = webview_in.getSettings();
  6. settings.setJavaScriptEnabled(true);
  7. }

我們再來看一下第二個問題:網頁後退而不是退出瀏覽器的問題。

需要用到的API:

①WebView.canGoBack():Gets whether this WebView has a back history item.

②WebView.goBack(): Goes back in the history of this WebView.

解決該問題的核心代碼:

[html] view plain copy

  1. /**
  2. * 方法描述:改寫物理按鍵——返回的邏輯
  3. *
  4. * @param keyCode
  5. * @param event
  6. * @return
  7. */
  8. @Override
  9. public boolean onKeyDown(int keyCode, KeyEvent event) {
  10. if (keyCode == KeyEvent.KEYCODE_BACK) {
  11. if (webview_in.canGoBack()) {
  12. webview_in.goBack();//返回上一頁面
  13. return true;
  14. } else {
  15. System.exit(0);//退出程序
  16. }
  17. }
  18. return super.onKeyDown(keyCode, event);
  19. }

現在把改進後的完整代碼貼出來:

[html] view plain copy

  1. public class WebViewActivity extends Activity {
  2. private WebView webview_in;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.web_activity);
  7. webview_in = (WebView) findViewById(R.id.webview_in);
  8. openJavaScript();
  9. //web資源
  10. webview_in.loadUrl("baidu.com");
  11. //設置WebViewClient客戶端
  12. webview_in.setWebViewClient(new WebViewClient() {
  13. @Override
  14. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  15. view.loadUrl(url);
  16. return true;
  17. }
  18. });
  19. }
  20. /**
  21. * 方法描述:啟用支持javascript
  22. */
  23. private void openJavaScript() {
  24. WebSettings settings = webview_in.getSettings();
  25. settings.setJavaScriptEnabled(true);
  26. }
  27. /**
  28. * 方法描述:改寫物理按鍵——返回的邏輯
  29. *
  30. * @param keyCode
  31. * @param event
  32. * @return
  33. */
  34. @Override
  35. public boolean onKeyDown(int keyCode, KeyEvent event) {
  36. if (keyCode == KeyEvent.KEYCODE_BACK) {
  37. if (webview_in.canGoBack()) {
  38. webview_in.goBack();//返回上一頁面
  39. return true;
  40. } else {
  41. System.exit(0);//退出程序
  42. }
  43. }
  44. return super.onKeyDown(keyCode, event);
  45. }
  46. }

解決完以上兩個問題以後我們再來看一下效果圖:

改進三:載入進度條

我先貼出來在模擬器中打開瀏覽器瀏覽的情況的一張圖:

上面這幅動態圖大家可以看出,每打開一個網頁就會在該網頁頂端顯示一個藍色的進度條,所以我們對WebView再進一步優化:顯示進度條。

為了在WebView頂部顯示進度條我們使用ProgressBar控制項。為了顯示進度我們需要用到的方法為setWebChromeClient (WebChromeClient client),該方法就是為了主要輔助WebView處理Javascript的對話框、網站圖標、網站title、載入進度等。它與WebViewClient的區別請看這篇章:WebViewClient與WebChromeClient的區別。OK,廢話不說,接下來就自定義一個WebView,代碼來了!!!

[html] view plain copy

  1. import android.content.Context;
  2. import android.graphics.Color;
  3. import android.graphics.drawable.ClipDrawable;
  4. import android.graphics.drawable.ColorDrawable;
  5. import android.util.AttributeSet;
  6. import android.view.Gravity;
  7. import android.webkit.WebView;
  8. import android.widget.ProgressBar;
  9. /**
  10. * Created by lzy on 2016/9/22.
  11. */
  12. public class ProgressWebView extends WebView {
  13. private ProgressBar progressbar;
  14. public ProgressWebView(Context context) {
  15. super(context);
  16. }
  17. public ProgressWebView(Context context, AttributeSet attrs, int defStyleAttr) {
  18. super(context, attrs, defStyleAttr);
  19. }
  20. public ProgressWebView(Context context, AttributeSet attrs) {
  21. super(context, attrs);
  22. initProgressBar(context);
  23. setWebChromeClient(new WebChromeClient());
  24. }
  25. private void initProgressBar(Context context) {
  26. progressbar = new ProgressBar(context, null, android.R.attr.progressBarStyleHorizontal);
  27. progressbar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, dp2px(context, 3), 0, 0));
  28. //改變progressbar默認進度條的顏色(深紅色)為Color.GREEN
  29. progressbar.setProgressDrawable(new ClipDrawable(new ColorDrawable(Color.GREEN), Gravity.LEFT, ClipDrawable.HORIZONTAL));
  30. addView(progressbar);
  31. }
  32. @Override
  33. protected void onScrollChanged(int l, int t, int oldl, int oldt) {
  34. super.onScrollChanged(l, t, oldl, oldt);
  35. }
  36. /**
  37. * 方法描述:根據手機的解析度從 dp 的單位 轉成為 px(像素)
  38. */
  39. public int dp2px(Context context, float dpValue) {
  40. final float scale = context.getResources().getDisplayMetrics().density;
  41. return (int) (dpValue * scale + 0.5f);
  42. }
  43. /**
  44. * 類描述:顯示WebView載入的進度情況
  45. */
  46. public class WebChromeClient extends android.webkit.WebChromeClient {
  47. @Override
  48. public void onProgressChanged(WebView view, int newProgress) {
  49. if (newProgress == 100) {
  50. progressbar.setVisibility(GONE);
  51. } else {
  52. if (progressbar.getVisibility() == GONE)
  53. progressbar.setVisibility(VISIBLE);
  54. progressbar.setProgress(newProgress);
  55. }
  56. super.onProgressChanged(view, newProgress);
  57. }
  58. }
  59. }

我們在布局文件中引入ProgressWebView:

[html] view plain copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="schemas.android.com/apk"
  3. android:layout_width_="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <com.lzy.webviewdemo.ProgressWebView
  7. android:id="@+id/progress_webview"
  8. android:layout_width_="match_parent"
  9. android:layout_height="match_parent"
  10. android:layout_marginTop="12dp" />
  11. </LinearLayout>

效果圖:

效果是不是很強勁很完美。。。。

封裝:

TinyWebView

進過對上面對WebView的一步一步改進, 現在我們自定義一個WebView---TinyWebView,一個讓其支持App內部顯示資源、支持JavaScript、支持顯示進度條的WebView。OK,上代碼:

[html] view plain copy

  1. package com.lzy.webviewdemo;
  2. import android.content.Context;
  3. import android.graphics.Color;
  4. import android.graphics.drawable.ClipDrawable;
  5. import android.graphics.drawable.ColorDrawable;
  6. import android.util.AttributeSet;
  7. import android.view.Gravity;
  8. import android.webkit.WebSettings;
  9. import android.webkit.WebView;
  10. import android.webkit.WebViewClient;
  11. import android.widget.ProgressBar;
  12. /**
  13. * Created by lzy on 2016/9/22.
  14. */
  15. public class TinyWebView extends WebView {
  16. private ProgressBar progressbar;
  17. public TinyWebView(Context context) {
  18. super(context);
  19. }
  20. public TinyWebView(Context context, AttributeSet attrs, int defStyleAttr) {
  21. super(context, attrs, defStyleAttr);
  22. }
  23. public TinyWebView(Context context, AttributeSet attrs) {
  24. super(context, attrs);
  25. initProgressBar(context);
  26. openJavaScript();
  27. setWebViewClient(new WebViewClient());
  28. setWebChromeClient(new WebChromeClient());
  29. }
  30. private void initProgressBar(Context context) {
  31. progressbar = new ProgressBar(context, null, android.R.attr.progressBarStyleHorizontal);
  32. progressbar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, dp2px(context, 3), 0, 0));
  33. //改變progressbar默認進度條的顏色(深紅色)為Color.GREEN
  34. progressbar.setProgressDrawable(new ClipDrawable(new ColorDrawable(Color.GREEN), Gravity.LEFT, ClipDrawable.HORIZONTAL));
  35. addView(progressbar);
  36. }
  37. /**
  38. * 方法描述:啟用支持javascript
  39. */
  40. private void openJavaScript() {
  41. WebSettings settings = getSettings();
  42. settings.setJavaScriptEnabled(true);
  43. }
  44. @Override
  45. protected void onScrollChanged(int l, int t, int oldl, int oldt) {
  46. super.onScrollChanged(l, t, oldl, oldt);
  47. }
  48. /**
  49. * 方法描述:根據手機的解析度從 dp 的單位 轉成為 px(像素)
  50. */
  51. public int dp2px(Context context, float dpValue) {
  52. final float scale = context.getResources().getDisplayMetrics().density;
  53. return (int) (dpValue * scale + 0.5f);
  54. }
  55. /**
  56. * 類描述:顯示WebView載入的進度情況
  57. */
  58. public class WebChromeClient extends android.webkit.WebChromeClient {
  59. @Override
  60. public void onProgressChanged(WebView view, int newProgress) {
  61. if (newProgress == 100) {
  62. progressbar.setVisibility(GONE);
  63. } else {
  64. if (progressbar.getVisibility() == GONE)
  65. progressbar.setVisibility(VISIBLE);
  66. progressbar.setProgress(newProgress);
  67. }
  68. super.onProgressChanged(view, newProgress);
  69. }
  70. }
  71. }

WebViewActivity

當某個事件觸發跳轉到一個只含有WebView的Activity頁面時,我們可以封裝一個這樣的Activity。該Activity接受的參數可以自己根據情況而定,先給出一個簡單的封裝類WebViewActivity。其布局文件中包含一個TextView用於顯示WebView頁面的標題,還有一個WebView控制項。比較簡單所以布局文件就不再貼出來了!直接看

[html] view plain copy

  1. public class WebViewActivity extends Activity {
  2. private TextView webviewTitle;
  3. private TinyWebView progressWebview;
  4. private String title;
  5. private String webViewUrl;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. requestWindowFeature(Window.FEATURE_NO_TITLE);
  10. setContentView(R.layout.web_activity);
  11. getData();
  12. initViews();
  13. loadData();
  14. }
  15. /**
  16. * 方法描述:接收數據
  17. */
  18. private void getData() {
  19. webViewUrl = getIntent().getStringExtra("webview_url");
  20. title = getIntent().getStringExtra("webview_title");
  21. }
  22. /**
  23. * 方法描述:初始化WebView
  24. */
  25. private void initViews() {
  26. progressWebview = (TinyWebView) findViewById(R.id.progress_webview);
  27. webviewTitle = (TextView) findViewById(R.id.text_webView_title);
  28. //web資源
  29. progressWebview.loadUrl(webViewUrl);
  30. }
  31. /**
  32. * 方法描述:載入數據
  33. */
  34. private void loadData() {
  35. if (!TextUtils.isEmpty(title))
  36. webviewTitle.setText(title);
  37. if (TextUtils.isEmpty(webViewUrl))
  38. progressWebview.loadUrl(webViewUrl);
  39. }
  40. /**
  41. * 方法描述:改寫物理按鍵——返回的邏輯
  42. */
  43. @Override
  44. public boolean onKeyDown(int keyCode, KeyEvent event) {
  45. if (keyCode == KeyEvent.KEYCODE_BACK) {
  46. if (progressWebview.canGoBack()) {
  47. progressWebview.goBack();//返回上一頁面
  48. return true;
  49. } else {
  50. System.exit(0);//退出程序
  51. }
  52. }
  53. return super.onKeyDown(keyCode, event);
  54. }
  55. /**
  56. * 方法描述:
  57. *
  58. * @param activity 發起跳轉的Activity
  59. * @param webviewUrl WebView的url
  60. * @param webviewTitle WebView頁面的標題
  61. */
  62. public static void skip(Activity activity, String webviewUrl, String webviewTitle) {
  63. Intent intent = new Intent(activity, WebViewActivity.class);
  64. intent.putExtra("webview_url", webviewUrl);
  65. intent.putExtra("webview_title", webviewTitle);
  66. activity.startActivity(intent);
  67. }
  68. }

使用如下:

[html] view plain copy

  1. WebViewActivity.skip(MainActivity.this,"baidu.com","百度首頁");

感受一下效果:

WebView載入本地HTML

OK,關於網路資源的載入到此結束,接下來看一下本地HTML資源的載入!

現在下來載入一個純純的本地的HTML文件,這樣載入出來的HTML頁面不能與Android端進行通信。載入本地HTML文件步驟:

1、創建HTML文件,並將其assets文件夾(當然assets文件夾也可以存放js文件)

2、利用WebView載入本地HTML

① 如果html文件存於assets:則加前綴:file:///android_asset/

② 如果html文件存於sdcard:則加前綴:content://com.android.htmlfileprovider/sdcard/

     注意:content前綴可能導致異常,直接使用file:///sdcard/ or file:/sdcard也可以

創建一個HTML文件

我們先創建一個HTML文件命名為myhtmlfile.html(這裡使用的是HTML5編寫) :該文件只顯示一段文本和一張圖片。

[html] view plain copy

  1. <!DOCTYPE html >
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  5. <style type="text/css">
  6. body{ font-size:12px; line-height:24px;}
  7. .title{font-size:36px;
  8. color:#ff0000;
  9. text-align:center;
  10. margin-top:28px
  11. }
  12. .content1{font-size:24px;
  13. color:#ff0000;
  14. text-align:center;
  15. margin-top:18px}
  16. .contentothers{font-size:24px;
  17. color:#ff0000;
  18. text-align:center;
  19. margin-top:8px}
  20. .imagecenter{text-align:center;
  21. margin-top:18px}
  22. </style>
  23. </head>
  24. <body>
  25. <div class="imagecenter"><img src="images/haha.jpg" /></div>
  26. <div class="title">打油詩</div>
  27. <div class="content1">富了投機倒把的</div>
  28. <div class="contentothers">提了吹牛拍馬的</div>
  29. <div class="contentothers">樹了弄虛作假的</div>
  30. <div class="contentothers">苦了奉公守法的</div>
  31. </body>
  32. </html>

在Activity中載入:

重點就在這:localWebview.loadUrl("file:///android_asset/myhtmlfile.html");

[html] view plain copy

  1. public class LocalWebViewActivity extends Activity{
  2. private WebView localWebview;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.local_webview_activity);
  7. localWebview = (WebView) findViewById(R.id.local_webview);
  8. WebSettings settings = localWebview.getSettings();
  9. settings.setJavaScriptEnabled(true);
  10. settings.setSupportZoom(true);
  11. localWebview.loadUrl("file:///android_asset/myhtmlfile.html");
  12. localWebview.setWebViewClient(new WebViewClient());
  13. }
  14. }

看一下效果如何:

WebView與JS交互

僅僅載入本地HTML比較簡單,但是這樣也不能與Android交互,顯得實用性也不是很強呀!!!那麼接下來就來講一下Android與JS的交互。

上面的實例中我們只是簡單地展示了HTML頁面,但是HTML頁面卻不能與操控Android端的代碼,那麼現在我們來實現以下HTML中的JS代碼調用Android端的方法。

JS調用Android

1、首先要定義一個介面,這個介面相當於前端JS的服務介面(這裡指的是Android端,此時兩者的交互有點像CS結構,JS就是客戶端,Android是服務端),該介面中定義JS想要操控Android代碼的一些方法。拿上面的案例來說,當我點擊圖片時Android要彈出一個Toast,那麼在這個介面中就要為JS準備一個彈出Toast的方法。

2、要對WebView對象調用addJavascriptInterface()方法,這個方法就是把上一步定義的介面添加到WebView當中,意思就好像"WebView頁面中的JS客戶端可以調用Android端的方法了";

addJavascriptInterface()方法中有兩個參數這裡重點解釋一下,第一個參數就是我們第一步中定義的介面,那麼第一個方法為String類型,那麼它到底是什麼意思呢?它又有什麼作用呢?第二個參數就是我們第一個參數的「替身」,為什麼需要替身呢?JS調用Android代碼的時候,在前端JS代碼中不可能直接調用「介面名稱 .XXX()」,所以這時候就用到替身了。那麼JS中調用Android代碼(更準確地說是調用我們定義的介面)就可以「替身.XXX()」。

說了這麼多現在趕緊實現一下。我們得實現在上述例子的基礎上給圖片添加一個點擊事件,當用戶點擊圖片的時候JS調用Android介面中的方法彈出一個Toast。

我先把前端HTML頁面展示出來,其實就是在上述的基礎上給圖片添加了一個「onClick()」事件。

[html] view plain copy

  1. <!DOCTYPE html >
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  5. <style type="text/css">
  6. body{ font-size:12px; line-height:24px;}
  7. .title{font-size:36px;
  8. color:#ff0000;
  9. text-align:center;
  10. margin-top:28px
  11. }
  12. .content1{font-size:24px;
  13. color:#ff0000;
  14. text-align:center;
  15. margin-top:18px}
  16. .contentothers{font-size:24px;
  17. color:#ff0000;
  18. text-align:center;
  19. margin-top:8px}
  20. .imagecenter{text-align:center;
  21. margin-top:18px}
  22. </style>
  23. <script type="text/javascript">
  24. function invokeAndroidMethod(info) {
  25. javascript:<span stylex="font-size:18px;"><strong><span stylex="color:#FF0000;">qwert</span></strong></span>.showToast(info);
  26. }
  27. </script>
  28. </head>
  29. <body>
  30. <div class="imagecenter"><img id="image" src="images/haha.jpg"
  31. onclick="invokeAndroidMethod(JS調用Android中的方法!)"/></div>
  32. <div class="title">打油詩</div>
  33. <div class="content1">富了投機倒把的</div>
  34. <div class="contentothers">提了吹牛拍馬的</div>
  35. <div class="contentothers">樹了弄虛作假的</div>
  36. <div class="contentothers">苦了奉公守法的</div>
  37. </body>
  38. </html>

這裡要提醒一下,紅色的「qwert」就是我們剛才說的「替身」,這個替身可以隨意命名,但是注意要與addJavascriptInterface()中的第二個參數一致。

我們接下里再來看看Android端代碼:

[html] view plain copy

  1. public class LocalWebViewActivity extends Activity{
  2. private WebView localWebview;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.local_webview_activity);
  7. localWebview = (WebView) findViewById(R.id.local_webview);
  8. WebSettings settings = localWebview.getSettings();
  9. settings.setJavaScriptEnabled(true);
  10. settings.setSupportZoom(true);
  11. //WebView添加JS要調用的介面,注意參數
  12. <span stylex="color:#FF0000;"> localWebview.addJavascriptInterface(new JsInterface(),"<span stylex="font-size:18px;"><strong>qwert</strong></span>");</span>
  13. localWebview.loadUrl("file:///android_asset/myhtmlfile.html");
  14. localWebview.setWebViewClient(new WebViewClient());
  15. }
  16. <span stylex="color:#FF0000;"> /**
  17. * 介面描述:供JS調用的介面
  18. */
  19. public class JsInterface{
  20. /**
  21. * 方法描述:彈出一個Toast
  22. * @param message JS端需要傳遞的參數(也就是要Toast的內容)
  23. */
  24. @JavascriptInterface
  25. public void showToast(String message) {
  26. Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
  27. }
  28. }</span>
  29. }

與上一個案例中的代碼變化的地方用紅色標記了。現在看一下效果:

JS調用Android中的方法現在已經實現,那麼我們接下來看看Android調用JS的方法,Android代用JS可比JS調用Android簡單多了哦!!!

Android調用JS

步驟:

1、載入HTML:

[html] view plain copy

  1. webview.loadUrl("file:///android_asset/myhtmlfile.html");

2、設置JavaScript可用

[html] view plain copy

  1. WebSettings settings = localWebview.getSettings();
  2. settings.setJavaScriptEnabled(true);

3、調用HTML中用到的JavaScript方法

通過webView.loadUrl("javascript:xxx")方式就可以調用當前網頁中的名稱為xxx的javascript方法,如下:

[html] view plain copy

  1. webView.loadUrl("javascript:changeTitle(Android調用JS操控HTML界面)");

實例:

我們在之前的HTML頁面中再添加一個JS方法,讓這個方法改變打油詩的標題,調整後的HTML代碼如下:

[html] view plain copy

  1. <!DOCTYPE html >
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  5. <style type="text/css">
  6. body{ font-size:12px; line-height:24px;}
  7. .title{font-size:36px;
  8. color:#ff0000;
  9. text-align:center;
  10. word-wrap:break-word;
  11. word-break:break-all;
  12. margin: 0 auto;
  13. line-height:150%;
  14. margin-top:28px
  15. }
  16. .content1{font-size:24px;
  17. color:#ff0000;
  18. text-align:center;
  19. margin-top:18px}
  20. .contentothers{font-size:24px;
  21. color:#ff0000;
  22. text-align:center;
  23. margin-top:8px}
  24. .imagecenter{text-align:center;
  25. margin-top:18px}
  26. </style>
  27. <script type="text/javascript">
  28. function invokeAndroidMethod(info) {
  29. javascript:qwert.showToast(info);
  30. }
  31. <span stylex="color:#FF0000;"> <strong>function changeTitle(title) {
  32. document.getElementById(title).innerHTML= title;
  33. }</strong>
  34. </span>
  35. </script>
  36. </head>
  37. <body>
  38. <div class="imagecenter"><img stylex="border:1px #FF0000 solid;"id="image" src="images/haha.jpg" border="2"
  39. onclick="invokeAndroidMethod(JS調用Android中的方法!)"/></div>
  40. <div class="title" id="title">打油詩</div>
  41. <div class="content1">富了投機倒把的</div>
  42. <div class="contentothers">提了吹牛拍馬的</div>
  43. <div class="contentothers">樹了弄虛作假的</div>
  44. <div class="contentothers">苦了奉公守法的</div>
  45. </body>
  46. </html>

為了更能簡單地說明問題,我們再建一個Activity類,由於比較簡單直接上代碼:

[html] view plain copy

  1. /**
  2. * 類描述:Android調用JS
  3. * Created by lzy on 2016/9/22.
  4. */
  5. public class AndroidInvokeJS extends Activity {
  6. private Button btn_android_invoke_js;
  7. private WebView webView;
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.android_invoke_js);
  12. btn_android_invoke_js = (Button) findViewById(R.id.btn_android_invoke_js);
  13. webView = (WebView) findViewById(R.id.wv_android_invoke_js);
  14. // ①載入HTML文件
  15. webView.loadUrl("file:///android_asset/myhtmlfile.html");
  16. // ②設置JavaScript可用
  17. WebSettings settings = webView.getSettings();
  18. settings.setJavaScriptEnabled(true);
  19. btn_android_invoke_js.setOnClickListener(new View.OnClickListener() {
  20. @Override
  21. public void onClick(View v) {
  22. // ③調用HTML中用到的JavaScript方法
  23. webView.loadUrl("javascript:changeTitle(Android調用JS操控HTML界面)");
  24. }
  25. });
  26. }
  27. }

效果圖:

現在既實現了Android調用JS又現在了JS調用Android,那麼將兩者結合一下即可實現Android與JS的相互調用哦!!!


推薦閱讀:

TAG:Android | iOS | HTML5 |