日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android WebView与JavaScript交互详解

發(fā)布時間:2023/12/15 Android 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android WebView与JavaScript交互详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

近期工作項目中遇到Android的WebView與js交互問題,之前也知道有這方面的技術可以實現(xiàn)。但在用的過程中,卻發(fā)現(xiàn)還是需要用電心思。

現(xiàn)把我所了解的分享給大家,希望可以幫助到做類似項目的童鞋。

為方便演示,就在Android_assets下放置一個html。


html中內容展示如下

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Untitled Document</title> </head> <div id="div" style="width:100px; height:100px; background-color:#099;" οnclick="window.demo.javaMethod()"> </div> <body> </body> <script type="text/javascript"> function changeColor(){document.getElementById("div").style.backgroundColor='red';} </script> </html>

先來測試JavaScript調用java方法

步驟:

1.首先需要對WebView開啟對JavaScript支持

2.WebView向JavaScript暴露一個接口提供調用

3.html元素通過onClick等事件調用java方法

代碼粘貼如下

package com.example.admin.webview; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.webkit.JavascriptInterface; import android.webkit.WebSettings; import android.webkit.WebView; import android.widget.Toast; import java.io.BufferedReader; import java.io.InputStreamReader; public class MainActivity extends AppCompatActivity {private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView= (WebView) findViewById(R.id.webview); WebSettings settings=webView.getSettings(); //開啟對JavaScript的支持 settings.setJavaScriptEnabled(true); //加載本地assets下的html文件 webView.loadDataWithBaseURL(null,getFromAssets("test.html"),"text/html","utf-8",null); //參數(shù)1 Object對象 參數(shù)2 名稱 webView.addJavascriptInterface(MainActivity.this,"demo"); }private String getFromAssets(String fileName){try {InputStreamReader inputReader = new InputStreamReader( getResources().getAssets().open(fileName) ); BufferedReader bufReader = new BufferedReader(inputReader); String line=""; String Result=""; while((line = bufReader.readLine()) != null)Result += line; return Result; } catch (Exception e) {e.printStackTrace(); return null; }}@JavascriptInterface public void javaMethod(){Toast.makeText(MainActivity.this, "javascript調用了java方法!", Toast.LENGTH_SHORT).show(); } }


效果圖





需要注意的地方就是JavaScript中 ?window.展露名稱.方法名 ? ?這里必須對應


下面是java調用js方法

步驟:

1.開啟JavaScript支持

2.使用WebView的loadURl方法調用JavaScript方法

代碼粘貼如下

package com.example.admin.webview; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.webkit.WebSettings; import android.webkit.WebView; import android.widget.Button; import java.io.BufferedReader; import java.io.InputStreamReader; public class MainActivity extends AppCompatActivity {private WebView webView; private Button bt_test; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView= (WebView) findViewById(R.id.webview); bt_test= (Button) findViewById(R.id.bt_test); WebSettings settings=webView.getSettings(); //開啟對JavaScript的支持 settings.setJavaScriptEnabled(true); //加載本地assets下的html文件 webView.loadDataWithBaseURL(null,getFromAssets("test.html"),"text/html","utf-8",null); bt_test.setOnClickListener(new View.OnClickListener() {@Override public void onClick(View v) {webView.loadUrl("javascript:changeColor()"); }}); }private String getFromAssets(String fileName){try {InputStreamReader inputReader = new InputStreamReader( getResources().getAssets().open(fileName) ); BufferedReader bufReader = new BufferedReader(inputReader); String line=""; String Result=""; while((line = bufReader.readLine()) != null)Result += line; return Result; } catch (Exception e) {e.printStackTrace(); return null; }} }

效果圖 ? ? 點擊測試按鈕 ?調用js方法 ? 將div顏色改變?yōu)榧t色







這也就是普遍的WebView與js交互的方式

那么問題來了,如果JavaScript方法有返回值時候,會怎么樣?

先來測試一下

?修改html中JavaScript代碼為

<script type="text/javascript"> function changeColor(){document.getElementById("div").style.backgroundColor='red';return "qwertyuiop";} </script> 再點擊按鈕





這個時候WebView出現(xiàn)了重定向

解決方案如下

在Android4.4以后,WebView新增了一個API--evaluateJavascript(String script,ValueCallback<ResultType>)

用法如下

bt_test.setOnClickListener(new View.OnClickListener() {@Override public void onClick(View v) {webView.evaluateJavascript("changeColor()", new ValueCallback<String>() {@Override public void onReceiveValue(String value) {Toast.makeText(MainActivity.this, "返回值"+value, Toast.LENGTH_SHORT).show(); }}); } }); 效果如下


至于4.4之前的該怎么辦?

目前的解決方案是通過java反射機制

在android.webkit包中有個BrowserFrame私有類,該類中有個Native方法:

public native String stringByEvaluatingJavaScriptFromString(String script)

使用步驟

1.擴展WebView添加方法,并使用反射實現(xiàn)。

2.將布局文件中的WebView修改為自定義的WebView

3.使用新的WebView調用方法,執(zhí)行js方法獲取返回值


自定義WebView如下

????public?String stringByEvaluatingJavaScriptFromString(String script) {

???????try?{

???????????//由webview取到webviewcore

???????????Field field_webviewcore = WebView.class.getDeclaredField("mWebViewCore");??????????????

???????????field_webviewcore.setAccessible(true);

???????????Object obj_webviewcore = field_webviewcore.get(this);

???????????//由webviewcore取到BrowserFrame

???????????Field field_BrowserFrame = obj_webviewcore.getClass().getDeclaredField("mBrowserFrame");

???????????field_BrowserFrame.setAccessible(true);

???????????Object obj_frame = field_BrowserFrame.get(obj_webviewcore);???????

???????????//獲取BrowserFrame對象的stringByEvaluatingJavaScriptFromString方法

???????????Method method_stringByEvaluatingJavaScriptFromString = obj_frame.getClass().getMethod("stringByEvaluatingJavaScriptFromString", String.class);

???????????//執(zhí)行stringByEvaluatingJavaScriptFromString方法

???????????Object obj_value = method_stringByEvaluatingJavaScriptFromString.invoke(obj_frame, script);

???????????//返回執(zhí)行結果

???????????return?String.valueOf(obj_value);

???????}?catch?(SecurityException e) {

???????????//?TODO?Auto-generated catch block

???????????e.printStackTrace();

???????}?catch?(NoSuchFieldException e) {

???????????//?TODO?Auto-generated catch block

???????????e.printStackTrace();

???????}?catch?(IllegalArgumentException?e) {

???????????//?TODO?Auto-generated catch block

???????????e.printStackTrace();

???????}?catch?(IllegalAccessException e) {

???????????//?TODO?Auto-generated catch block

???????????e.printStackTrace();

???????}?catch?(NoSuchMethodException e) {

???????????//?TODO?Auto-generated catch block

???????????e.printStackTrace();

???????}?catch?(InvocationTargetException e) {

???????????//?TODO?Auto-generated catch block

???????????e.printStackTrace();

???????}

???????return?null;

????}

}


轉自:https://blog.csdn.net/sy18298711239/article/details/51945478

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結

以上是生活随笔為你收集整理的Android WebView与JavaScript交互详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。