js調用android的方法返回值
㈠ 在android中怎樣調用本地js文件里的方法並得到返回值
在android中調用本地js文件里的方法並得到返回值其方法如下: Android中內置了WebKit模塊,而該模塊的java層視圖類就是WebView,所有需要使用Web瀏覽器功能的Android都需要創建該視圖類對象顯示和處理請求的網路資源。目前WebKit支持Http、Https、Ftp和JavaScript請求。下面是在Android中調用JavaScript方法以及如何在js中調用本地方法。 1、在Assets下放一個簡單的html文件jstest/apk/res/android" > <WebView android:id="@+id/wv_test" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@+id/btn_showmsg"/> <Button android:id="@+id/btn_showmsg" android:layout_width="200dip" android:layout_height="40dip" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:text="調用html中js方法"/> </RelativeLayout> 3、然後是Activity,MainActivity.java package com.harold.jstest; import com.harold.base.JSKit; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.View.OnClickListener; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.widget.Button; public class MainActivity extends Activity { private WebView mWebView; private Button btnShowInfo; private JSKit js; private Handler mHandler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //初始化控制項 mWebView = (WebView) findViewById(R.id.wv_test); btnShowInfo = (Button) findViewById(R.id.btn_showmsg); //實例化js對象 js = new JSKit(this); //設置參數 mWebView.getSettings().setBuiltInZoomControls(true); //內容的渲染需要webviewChromClient去實現,設置webviewChromClient基類,解決js中alert不彈出的問題和其他內容渲染問題 mWebView.setWebChromeClient(new WebChromeClient()); mWebView.getSettings().setJavaScriptEnabled(true); //把js綁定到全局的myjs上,myjs的作用域是全局的,初始化後可隨處使用 mWebView.addJavascriptInterface(js, "myjs"); mWebView.loadUrl("file:///android_asset/jstest.html"); btnShowInfo.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mHandler.post(new Runnable() { @Override public void run() { //調用 HTML 中的javaScript 函數 mWebView.loadUrl("javascript:showMsg()"); } }); } }); } } 4、最後是綁定全局js的類JSKit.java package com.harold.base; import android.widget.Toast; import com.harold.jstest.MainActivity; public class JSKit { private MainActivity ma; public JSKit(MainActivity context) { this.ma = context; } public void showMsg(String msg) { Toast.makeText(ma, msg, Toast.LENGTH_SHORT).show(); } } 例子比較簡單,代碼里都加了注釋,這里就不多說了,本示例用的本地的html,如果訪問網路中的網頁,別忘記在AndroidManifest.xml中加許可權 <uses-permission android:name="android.permission.INTERNET"/>
㈡ H5&&Android交互
JS調用Android原生方法,參數須是Java的內置類型:int、String等,若是JavaScript對象,需字元串化,否則Android無法正確接收;
JS調用Android原生方法,返回值是內置類型:int、String等,JS能夠正確接收。若是Java自定義類型,則JS接收不到正確數據;
JS可以通過Android原生方法的返回值獲取內置類型的參數,如String
若需要互傳復雜類型的對象,雙方須以String對媒介,以各自語言的Json工具類進行相互轉化;
㈢ android嵌入h5,怎麼交互
Android和H5之間的交互
hybrid App開發也不是什麼新鮮事了,其中native和h5之間的交互則是必不可少的。Android中是如何和H5交互的?
1、webView載入頁面
我們都知道在Android中是通過webView來載入html頁面的,根據HTML文件所在的位置不同寫法也不同:
//例如:載入assets文件夾下的test.html頁面
mWebView.loadUrl("file:///android_asset/test.html")
//例如:載入網頁
mWebView.loadUrl("http://www..com")
如果只是這樣調用mWebView.loadUrl()載入的話,那麼當你點擊頁面中的鏈接時,頁面將會在你手機默認的瀏覽器上打開。那如果想要頁面在App內中打開的話,那麼就得設置setWebViewClient:
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
mWebView.loadUrl(url);
return true;
}
}
});
2、Android本地通過Java調用HTML頁面中的JavaScript方法
想要調用js方法那麼就必須讓webView支持
WebSettings webSettings = mWebView.getSettings();
//設置為可調用js方法
webSettings.setJavaScriptEnabled(true);
若調用的js方法沒有返回值,則直接可以調用mWebView.loadUrl("JavaScript:do()");其中do是js中的方法;若有返回值時我們可以調用mWebView.evaluateJavascript()方法:
mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.e(TAG, "onReceiveValue value=" + value);
}
});
js代碼如下:
<script type="text/javascript">
function sum(a,b){
return a+b;
}
function do(){
document.getElementById("p").innerHTML="hello world";
}
</script>
2、js調用Android本地Java方法
在Android4.2以上可以直接使用@JavascriptInterface註解來聲明,下面是在一個本地Java方法
public class JsInteration {
@JavascriptInterface
public String back() {
return "hello world";
}
}
定義完這個方法後再調用mWebView.addJavascriptInterface()方法:
mWebView.addJavascriptInterface(new JsInteration(), "android");
那麼在js中怎麼來調用呢?
<script type="text/javascript">
function s(){
//調用Java的back()方法
var result =window.android.back();
document.getElementById("p").innerHTML=result;
}
</script>
4、攔截HTML頁面中的點擊事件
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//判斷url攔截事件
if (url.equals("file:///android_asset/test2.html")) {
Log.e(TAG, "shouldOverrideUrlLoading: " + url);
startActivity(new Intent(MainActivity.this,Main2Activity.class));
return true;
} else {
mWebView.loadUrl(url);
return false;
}
}
});
以上就是Java調用js方法以及js調用Java方法的實現交互方式中的一種。下面給出完整代碼:
mainActivity
public class MainActivity extends AppCompatActivity {
public static final String TAG = "MainActivity";
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = (WebView) findViewById(R.id.webView);
mWebView.loadUrl("file:///android_asset/test.html");
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JsInteration(), "android");
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.equals("file:///android_asset/test2.html")) {
Log.e(TAG, "shouldOverrideUrlLoading: " + url);
startActivity(new Intent(MainActivity.this,Main2Activity.class));
return true;
} else {
mWebView.loadUrl(url);
return false;
}
}
});
}
//Android調用有返回值js方法
@TargetApi(Build.VERSION_CODES.KITKAT)
public void onClick(View v) {
mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.e(TAG, "onReceiveValue value=" + value);
}
});
}
public class JsInteration {
@JavascriptInterface
public String back() {
return "hello world";
}
}
}
test.html
<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript">
function sum(a,b){
return a+b;
}
function s(){
var result =window.android.back();
document.getElementById("p").innerHTML=result;
}
</script>
</head>
<body>
<button onclick="s()">調用本地方法</button>
<a href="file:///android_asset/test2.html">點擊</a>
<p id="p"></p>
</body>
</html>
㈣ JS 調用android的方法該怎麼調
<body>
<!-- Calls into the javascript interface for the activity -->
<!-- 從HTML文件中調用activity中的函數 -->
<!-- 也就是從HTML到android程序 留意window.demo.clickOnAndroid()這句話 -->
<a onClick="window.demo.clickOnAndroid()">Click</a>
</body>
mWebView.addJavascriptInterface(newDemoJavaScriptInterface(),"demo");
{
DemoJavaScriptInterface(){
}
/**
*ThisisnotcalledontheUIthread.Postarunnabletoinvoke
*
*loadUrlontheUIthread.
*
*/
publicvoidclickOnAndroid(){//注意這里的名稱。它為clickOnAndroid(),注意,注意,嚴重注意
mHandler.post(newRunnable(){
publicvoidrun(){
Toast.makeText....
}
});
}
}
㈤ 如何在JAVASCRIPT調用Android JAVA函數
首先是網頁:
<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
<!DOCTYPEHTML>
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=UTF-8">
<title>js和android相互調用</title>
<head>
<scripttype="text/javascript"language="javascript">
//調用java方法jsCallJava()
functionshowHtmlcallJava(){
varstr=window.android.jsCallJava();
document.getElementById("info1").value=str;
}
//調用java方法jsCallJavaWithParams(Stringvar),帶參數
functionshowHtmlcallJava2(){
varstr=window.android.jsCallJavaWithParams("DevinChen");
document.getElementById("info2").value=str;
}
//提供給java調用的方法
functionshow(){
document.getElementById("id_input").value="Java調用Html中的方法";
}
//提供給java調用的方法,帶參數
functionshowWithParam(param){
document.getElementById("id_input2").value="Java調用Html中的方法:"+param;
}
</script>
</head>
<body>
<inputid="info1"style="width:90%"type="text"value="null"/><br>
<inputtype="button"value="Html調用Java方法"onclick="showHtmlcallJava()"/><br>
<inputid="info2"style="width:90%"type="text"value="null"/><br>
<inputtype="button"value="Html調用帶參數的Java方法"onclick="showHtmlcallJava2()"/><br>
<inputid="id_input"style="width:90%"type="text"value="null"/><br>
<inputtype="button"value="Java調用Html方法"onclick="window.android.javaCallJavaScript()"/><br>
<inputid="id_input2"style="width:90%"type="text"value="null"/><br>
<inputtype="button"value="Java調用帶參數的Html方法"onclick="window.android.javaCallJavaScriptWithParams()"/>
</body>
</html>
Android部分的布局就一個WebView,MainActivity源代碼:
/**
*java方法和javascript方法的相互調用
*/
{
privatestaticfinalStringurl="http://192.168.0.100:8080/server";
privateWebViewmWebView;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
privatevoidinitView(){
mWebView=(WebView)findViewById(R.id.web_main);
WebSettingssettings=mWebView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setDefaultTextEncodingName("utf-8");
mWebView.loadUrl(url);
mWebView.setWebViewClient(newWebViewClient());
//這兩句是必須的,"android"就是jsp中調用方法時window後面的對象
Objectobj=getObject();
mWebView.addJavascriptInterface(obj,"android");
}
privateObjectgetObject(){
Objectobj=newObject(){
/**
*html中的JavaScript調用Java方法
*註解是必須的
*@return
*/
@JavascriptInterface
publicStringjsCallJava(){
return"JavaScript調用Java方法";
}
/**
*html中的JavaScript調用帶參數的Java方法
*註解是必須的
*@return
*/
@JavascriptInterface
(Stringvar){
return"JavaScript調用帶參數的Java方法"+var;
}
/**
*java調用html中的方法,遺憾的是不知道有什麼辦法可以拿到返回值
*/
@JavascriptInterface
publicvoidjavaCallJavaScript(){
runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
mWebView.loadUrl("javascript:show()");
}
});
}
/**
*java調用html中的方法,並且傳遞參數,這個有大用
*/
@JavascriptInterface
(){
runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
mWebView.loadUrl("javascript:showWithParam('baoge')");
}
});
}
};
returnobj;
}
}
㈥ 在Android上怎樣實現JAVA和JS交互
在Android的開發過程中、遇到一個新需求、那就是讓Java代碼和Javascript代碼進行交互、在IOS中實現起來很麻煩、而在Android中相對來說容易、Android對這種交互進行很好的封裝、其實可以很簡單的用Java代碼調用WebView中的js函數、也可以用WebView中的js來調用Android應用中的Java代碼
一、網頁的JS代碼調用ANDROID中JAVA代碼的方法
在網頁中調用java代碼、需要在webview控制項中添加javascriptInterface
contentWebView = (WebView) findViewById(R.id.webview);
//啟用javascript
contentWebView.getSettings().setJavaScriptEnabled(true);
contentWebView.addJavascriptInterface(this, "js對象名");
在Activity中定義一個要被js調用的方法、src為js傳遞過來的參數、如果沒有不傳也可以的。
public void jsFunction(final String str) {
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
runOnUiThread(new Runnable() {
@Override
public void run() {
//在里對Android應用的UI進行處理
}
});
}
在網頁中、只需要像調用js方法一樣、進行調用就可以
<a onClick="window.js對象名.jsFunction(´hello world´)" >
點擊調用java代碼並傳遞參數
</a>
二、ANDROID中JAVA代碼調用網頁的JS代碼的方法
Java代碼調用js並傳參其實是通過WebView的loadUrl方法去調用的、只是參數url的寫法不一樣
// 無參數調用
contentWebView.loadUrl("javascript:javacalljs()");
// 傳遞參數調用
contentWebView.loadUrl("javascript:javacalljswithargs("
+ "´hello world´" + ")");
三、JAVA和JS交互注意事項
1、Java 調用 js 裡面的函數、效率並不是很高、估計要200ms左右吧、做交互性很強的事情、這種速度很難讓人接受、而js去調Java的方法、速度很快、50ms左右、所以盡量用js調用Java方法
2、Java 調用 js 的函數、沒有返回值、調用就控制不到
3、Js 調用 Java 的方法、返回值如果是字元串、你會發現這個字元串是 native 的、轉成 locale 的才能正常使用、使用 toLocaleString() 函數就可以、不過這個函數的速度並不快、轉化的字元串如果很多、將會很耗費時間
4、網頁中盡量不要使用jQuery、執行起來需要5-6秒、最好使用原生的js寫業務腳本、以提升載入速度、改善用戶體驗
㈦ 在android中怎樣調用本地js文件里的方法並得到返回值
您好,很高興能幫助您,
Android中webview和js之間的交互
1.android中利用webview調用網頁上的js代碼。
Android 中可以通過webview來實現和js的交互,在程序中調用js代碼,只需要將webview控制項的支持js的屬性設置為true,,然後通過loadUrl就可以直接進行調用,如下所示:
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl("javascript:test()");
2. 網頁上調用android中java代碼的方法
在網頁中調用java代碼,需要在webview控制項中添加javascriptInterface。如下所示:
mWebView.addJavascriptInterface(new Object() {
public void clickOnAndroid() {
mHandler.post(new Runnable() {
public void run() {
Toast.makeText(Test.this, "測試調用java", Toast.LENGTH_LONG).show();
}
});
}
}, "demo");
在網頁中,只需要像調用js方法一樣,進行調用就可以
<div id='b'><a onclick="window.demo.clickOnAndroid()">b.c</a></div>
3. Java代碼調用js並傳參
首先需要帶參數的js函數,如function test(str),然後只需在調用js時傳入參數即可,如下所示:
mWebView.loadUrl("javascript:test('aa')");
4.Js中調用java函數並傳參
首先一樣需要帶參數的函數形式,但需注意此處的參數需要final類型,即得到以後不可修改,如果需要修改其中的值,可以先設置中間變數,然後進行修改。如下所示:
mWebView.addJavascriptInterface(new Object() {
public void clickOnAndroid(final int i) {
mHandler.post(new Runnable() {
public void run() {
int j = i;
j++;
Toast.makeText(Test.this, "測試調用java" + String.valueOf(j), Toast.LENGTH_LONG).show();
}
});
}
}, "demo");
然後在html頁面中,利用如下代碼<div id='b'><a onclick="window.demo.clickOnAndroid(2)">b.c</a></div>,
即可實現調用
你的採納是我前進的動力,還有不懂的地方,請你繼續「追問」!
如你還有別的問題,可另外向我求助;答題不易,互相理解,互相幫助!