Android WebView和JavaScript交互

  JavaScript在現在的網頁設計中用得很多,Android 的WebView可以載入網頁,WebView也設計了與JavaScript通信的橋梁。這篇主要介紹一下WebViewk控件如何和JavaScript進行交互。

WebView:

  WebView和網頁相關的主要有一下幾個方法: 

      setWebViewClient(); ? ?

      setWebChromeClient();

      addJavascriptInterface();

      loadUrl();

    setWebViewClient():設置一個WebViewClient的對象,通過這個對象的幾個回調方法,可以知道當前網頁的狀態。

    setWebViewChromeClient(): 設置一個WebChromeClient對象,JavaScript調用的一些內建方法都是通過這個對象來處理的。

    addJavascriptInterface(): 設置JavaScript的接口,有兩個參數,第一個一般是一個Object對象,里面實現的方法都是網頁里JavaScript可以調用到的,第二個參數是一個字符串,最后到JavaScript就相當于一個對象名,JavaScript通過這個對象名調用第一個參數里面實現的方法。要使這個方法生效,要通過WebView的getSettings()方法獲取WebSettings對象,設置JavaScript使能?setJavaScriptEnabled(true)。

    loadUrl():載入相應網頁。

  下面實現了一個簡單的Demo(最后有效果圖): 主要的流程是載入了asset目錄下的一個內置網頁,點擊網頁上的Click按鈕,會調用通過addJavascriptInterface方法設置下去的Object的show()方法,這個方法里通過loadUrl的方式調用JavaScript的javaScriptshow()方法,這個方法里又調用了Java的result()方法,result方法里顯示了一個Toast.需要注意的是show()方法的回調和result()方法的回調是不在主線程的。

MainActivity.java

 1 package com.example.administrator.webviewl;
 2 
 3 import android.graphics.Bitmap;
 4 import android.os.Handler;
 5 import android.support.v7.app.AppCompatActivity;
 6 import android.os.Bundle;
 7 import android.util.Log;
 8 import android.webkit.JavascriptInterface;
 9 import android.webkit.JsResult;
10 import android.webkit.WebChromeClient;
11 import android.webkit.WebResourceError;
12 import android.webkit.WebResourceRequest;
13 import android.webkit.WebView;
14 import android.webkit.WebViewClient;
15 import android.widget.Toast;
16 
17 public class MainActivity extends AppCompatActivity {
18 
19     private static final String TAG = "MainActivity.TAG";
20     WebView mWebView;
21     Handler mHander = new Handler();
22     @Override
23     protected void onCreate(Bundle savedInstanceState) {
24         super.onCreate(savedInstanceState);
25         setContentView(R.layout.activity_main);
26         mWebView = (WebView)findViewById(R.id.mWebView);
27         initWebView();
28     }
29 
30     public void initWebView() {
31         mWebView.getSettings().setJavaScriptEnabled(true);
32         mWebView.setWebViewClient(new WebViewClientCustom());
33         mWebView.addJavascriptInterface(new Object() {
34             @JavascriptInterface
35             public void result(final String result) {
36                 Log.d(TAG,"javaScript 調用java的方法 返回結果 result = " + result);
37                 mHander.post(new Runnable() {
38                     @Override
39                     public void run() {
40                         if (result.length() > 0) Toast.makeText(MainActivity.this,"你輸入了: " + result,Toast.LENGTH_SHORT).show();
41                     }
42                 });
43             }
44             @JavascriptInterface
45             public void show() {
46                 Log.d(TAG,"JavaScript 調用java show()");
47                 mHander.post(new Runnable() {
48                     @Override
49                     public void run() {
50                         Log.d(TAG,"java 調用 javaScript  javaScriptshow()");
51                         mWebView.loadUrl("JavaScript:javaScriptshow()");
52                     }
53                 });
54                 return;
55             }
56         },"JavaScriptL");
57         mWebView.loadUrl("file:///android_asset/index.html");
58     }
59 
60     public class WebViewClientCustom  extends WebViewClient {
61         @Override
62         public void onPageStarted(WebView view, String url, Bitmap favicon) {
63             Log.d(TAG,"onPageStarted");
64             super.onPageStarted(view, url, favicon);
65         }
66 
67         @Override
68         public void onPageFinished(WebView view, String url) {
69             Log.d(TAG,"onPageFinished");
70             super.onPageFinished(view, url);
71         }
72 
73         @Override
74         public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
75             Log.d(TAG,"onReceivedError");
76             super.onReceivedError(view, request, error);
77         }
78     }
79 }
View Code

index.html ?內置的網頁

 1 <!doctype html>
 2 <html lang="en">
 3  <head>
 4   <meta charset="UTF-8">
 5   <meta name="Generator" content="EditPlus?">
 6   <meta name="Author" content="">
 7   <meta name="Keywords" content="">
 8   <meta name="Description" content="">
 9   <title>javaScript</title>
10   <script type="text/javaScript">
11         function javaScriptshow() {
12             var a = document.getElementById("text").value;
13             JavaScriptL.result(a);
14         }
15 </script>
16  </head>
17  <body style="text-align:center;margin-top:100px">
18     <p > Android javaScript學習</p>
19     <form action="">
20          <input type="text" id = "text" value=""/>
21         <input type="button" onclick="window.JavaScriptL.show()" value="Click" />
22     </form>
23  </body>
24 </html>

 

 實現的效果圖如下:

  

轉載于:https://www.cnblogs.com/xiaojianli/p/5676406.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287016.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287016.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287016.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Microsoft Dev Box 帶來全新云上開發體驗

在 5 月 24 日, 微軟的產品經理 Anthony Cangialosi 在 Azure 社區發布了一篇博客(Introducing Microsoft Dev Box)&#xff0c; 宣布推出 Microsoft Dev Box !這是一種新的云服務&#xff0c;托管在 Microsoft Azure 中&#xff0c;提供了一個開箱即用的開發工作站&#xff0c…

游戲開發如此簡單?我直接創建了一個游戲場景【python 游戲實戰 02】

前言 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新…

【三維激光掃描】第五章:基于點云數據的三維建模

第一節 繪制立面圖 1. 打開CAD 2014,新建一個文件,模板選擇acadiso.dwt,如下圖。 2. 點擊插入→創建點云。

Flutter之基本數據類型測試

1、Flutter的數據基本類型 Dart語言里一切皆為對象&#xff0c;所以如果沒有將變初始化,那么它的默認值為null Number(int、doubkle)StringBoolean(bool) List Map2、測試代碼 void testData() {//Number包含了int和doubleint a 4;int b 8;print(a b);int a1;if (a null)…

清北·NOIP2017濟南考前沖刺班 DAY1 morning

立方數(cubic) Time Limit:1000ms Memory Limit:128MB 題目描述 LYK定義了一個數叫“立方數”&#xff0c;若一個數可以被寫作是一個正整數的3次方&#xff0c;則這個數就是立方數&#xff0c;例如1,8,27就是最小的3個立方數。 現在給定一個數P&#xff0c;LYK想要知道這個數…

2020美國紐約大學計算機科學排名,2020美國紐約大學排名第幾

紐約大學在2020年《美國新聞與世界報道》美國全國性大學排名中排名第29名&#xff0c;在2020年QS世界大學排名中排名第39名。紐約大學專業排名QS世界大學生命科學與醫學專業排名 2020年 第40名QS世界大學醫學專業排名 2020年 第34名QS世界大學牙科專業排名 2020年 第14名QS世界…

saltstack 安裝nginx

1. 目錄結構[rootqing salt]# tree /srv/salt/nginx//srv/salt/nginx/-- config.sls-- files| -- nginx| -- nginx-1.0.15.tar.gz| -- nginx.conf| -- nginx_log_cut.sh| -- nginx-upstream-jvm-route-0.1.tar.gz-- init.sls-- install.sls1 directory, 8 files2. [r…

ArcGIS實驗教程——實驗三十一:ArcGIS構建泰森多邊形(Thiessen Polygon)實例精解

泰森多邊形是進行快速插值和分析地理實體影響區域的常用工具。例如,用離散點的性質描述多邊形區域的性質,用離散點的數據計算泰森多邊形區域的數據。泰森多邊形可用于定性分析、統計分析和臨近分析等。 ArcGIS實驗視頻教程合集:《ArcGIS實驗教程從入門到精通》(附配套實驗…

Python的魔法方法 .

基本行為和屬性 __init__(self[,....])構造函數 . 在實例化對象的時候會自動運行 __del__(self)析構函數 . 在對象被回收機制回收的時候會被調用 __str__(self)輸出函數 . 在實例對象請求輸出的時候會被調用. __repr__(self). 當直接調用實例對象的時候會被調用 __new__(cls,[,…

游戲角色開始動起來了,真帥!【python 游戲實戰 03】

前言 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新…

如何讓 ASP.NET Core 支持綁定查詢字符串中的數組

前言有網友在交流群中詢問&#xff0c;如何讓 ASP.NET Core 支持綁定查詢字符串中的數組&#xff1a;據說&#xff0c;在 .NET 7 中已經支持了&#xff1a;但是&#xff0c;在這之前的 .NET 版本能實現相同功能嗎&#xff1f;ByteArrayModelBinder這時&#xff0c;群里的網友提…

Docker Storm開發環境搭建

2019獨角獸企業重金招聘Python工程師標準>>> 1. compose文件 storm-stack.yml version: 3.1services:zookeeper:image: zookeepercontainer_name: zookeeperrestart: alwaysports:- 2181:2181nimbus:image: stormcontainer_name: nimbuscommand: storm nimbusdepend…

Android之解決YouTubePlayerView啟動在Android5.0左右的手機出現奔潰問題

1 問題 用YouTubePlayerView(https://github.com/PierfrancescoSoffritti/android-youtube-player)在部分Android5.0手機上初始化的時候出現手機奔潰,錯誤提示如下 關鍵日志如下: Error inflating class com.pierfrancescosoffritti.androidyoutubeplayer.core.player.v…

重慶大學計算機課程設計,計算機組成原理課程設計報告重慶大學.doc

計算機組成原理課程設計報告重慶大學計算機組成原理課程設計報告題目&#xff1a;微程序設計專業&#xff1a;計算機科學與技術班級&#xff1a;指導老師&#xff1a;目錄一、摘要二、設計要求三、微程序控制器原理四、總體設計五、測試六、結論七、參考文獻目錄八、 個人總結重…

一些服務器編程的概念

IO線程&#xff1a;有Event loop的線程&#xff0c;每個線程有且有一個loop&#xff0c;用per thread變量記錄這個loop的對象地址&#xff0c;如果這個變量非空可以知道這個線程是IO線程 Channel&#xff1a;綁定到一個且只能一個loop&#xff0c;即某個IO線程&#xff0c;負責…

南方方洲號無人測量船系統簡介

南方智能測量船系統由小型無人船、自動導航模塊、聲納探測模塊、外圍傳感模塊、岸基操控終端、無人船專用軟件等部分組成。將先進的衛星定位、聲納、傳感器與智能導航控制等眾多技術相結合,提出了高精度、智能化、集成化、機動化、網絡化的勘測解決方案。該系統能自主航行并完…

1小時1篇文學會python再做個飛機大戰游戲

注&#xff1a; 想慢慢學習的同學可以看我的 《python 入門到游戲實戰專欄》&#xff08;更新中&#xff09; 想學 C 的同學可以看《大話系列之C語言》&#xff08;基本更新完&#xff09; 想學 C 的同學可以看《大話C》&#xff08;更新中&#xff09; 想做習題的可以看《大學…

Android之app作為服務器解決跨域問題

1 問題 APP用socket寫了服務器,然后PC發送請求到APP出現跨域問題。 2 解決辦法 在APP用socket服務器返回頭里面添加如下關鍵代碼 header="Content-Type: "+ JSON_TYPE + "; charset=utf-8 \r\n"+ "Connection: close\r\n"+ "Access-Cont…

如何優雅的編寫git的提交信息

前言在公司的日常工作當中或者個人的開源項目&#xff0c;將代碼提交到代碼庫時。都會遇到下面這樣的對話框&#xff0c;通常都會隨便寫點內容在里面。當遇到問題需要回溯的時候就成了給自己造成的麻煩&#xff0c;因為無法通過commit message來非常直觀的看到這一次提交了什么…

android快捷開發之Retrofit網絡加載框架的簡單使用

大家都知道&#xff0c;安卓最大的特點就是開源化&#xff0c;這自然會產生很多十分好用的第三方API&#xff0c;而基本每一個APP都會與網絡操作和緩存處理機制打交道&#xff0c;當然&#xff0c;你可以自己通過HttpUrlConnection再通過返回數據進行解析解決&#xff0c;而我們…