2017-03-07 47 views
2

我读过很多帖子,但无法让我的Android应用程序调用Javascript函数。这是我Android调用Java中的Javascript不起作用

public class BorrameActivity extends AppCompatActivity { 

    private static BorrameActivity.MyJavaScriptInterface myJavaScriptInterface; 
    private static WebView webView; 

    public class MyJavaScriptInterface { 
     Context mContext; 

     MyJavaScriptInterface(Context c) { 
      mContext = c; 
     } 

     @android.webkit.JavascriptInterface 
     public void doEchoTest(String echo){ 
      Log.e("printer", echo); 
      Toast toast = Toast.makeText(mContext, echo, Toast.LENGTH_SHORT); 
      toast.show(); 
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_borrame); 

     myJavaScriptInterface = new BorrameActivity.MyJavaScriptInterface(this); 
     webView = (WebView) findViewById(R.id.mybrowserAuthorise); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.addJavascriptInterface(myJavaScriptInterface, "JSInterface"); 
     webView.loadUrl("file:///android_asset/loginProtocol.html"); 
     //webView.loadUrl("javascript:JSInterface.doEchoTest('test')"); // THIS WORKS!! 
     webView.loadUrl("javascript:testEcho()"); // THIS DOES NOT WORK 
    } 
} 

当我执行

webView.loadUrl("javascript:JSInterface.doEchoTest('test')"); 

这工作,但在JavaScript函数是loginProtocol.html它不工作:

webView.loadUrl("javascript:testEcho()"); 

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="UTF-8"> 
    <meta name="viewport" content="width=device-width; user-scalable=0;" /> 
    <title></title> 
</head> 
<body style="visibility:visible"> 
    <!-- Used for debugging --> 
    <h1>HELLO</h1> 

    <script> 
     function testEcho(){ 
       JSInterface.doEchoTest('This does not get printed in Android Log'); 
     } 
    </script> 
</body> 
</html> 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.sedicii.app.sedicii.BorrameActivity"> 

    <WebView 
     android:id="@+id/mybrowserAuthorise" 
     android:layout_width="353dp" 
     android:layout_height="442dp"/> 

</LinearLayout> 

WebView似乎正在加载(我可以在Android屏幕上看到来自loginProtocol.html的HELLO)。

我缺少什么?

解决方案 我必须等到HTML页面加载。由于@KosWarm

webView.setWebViewClient(new WebViewClient() { 
    public void onPageFinished(WebView view, String url) { 
     webView.loadUrl("javascript:testEcho()"); 
    } 
}); 
+0

顺便说一句,我也试图与'window.JSInterface .doEchoTest('这不会在Android日志中打印');'它不起作用 – Mike

回答

1

我想你只需要给参数您使用loadURL方法:

webView.loadUrl("javascript:testEcho('Hello World!')"); 

和你的JavaScript函数必须看起来像:

function testEcho(testHello){ 
window.JSInterface.doEchoTest(testHello); 
} 
+0

我只是测试它,它不起作用。 – Mike

1

您执行方法loadUrl两次 在第二次执行时,第一页已关闭,因此其脚本无法执行

以下页面代码工作

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="UTF-8"> 
    <meta name="viewport" content="width=device-width; user-scalable=0;" /> 
    <title></title> 
</head> 
<body style="visibility:visible"> 
<!-- Used for debugging --> 
<h1>HELLO</h1> 

<script> 
     function testEcho(){ 
       JSInterface.doEchoTest('This does not get printed in Android Log'); 
     } 
     testEcho() //added this line 
    </script> 
</body> 
</html> 

更新

从这个地方Calling Javascript method from within webview in Android

重写活动onCrete方法

 myJavaScriptInterface = new MyJavaScriptInterface(this); 
     webView = (WebView) findViewById(R.id.mybrowserAuthorise); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.addJavascriptInterface(myJavaScriptInterface, "JSInterface"); 
     webView.loadUrl("file:///android_asset/loginProtocol.html"); 
     webView.setWebViewClient(new WebViewClient() { 
     public void onPageFinished(WebView view, String url) { 
      webView.loadUrl("javascript:testEcho()"); 
     } 
     }); 
+0

是的,'testEcho()'现在被执行。但是通过这种方法,它总是**在HTML页面加载时执行,当我从Android Java代码'webView.loadUrl(“javascript:testEcho()”);'中移除它时调用''。 我想实际上_call_从Android的JS函数,而不是加载一个自动执行该函数的HTML。调用'loadUrl'两次不好? – Mike

+1

也许这就是你要找的东西http://stackoverflow.com/questions/35906557/calling-javascript-method-from-within-webview-in-android – KosWarm

+1

load_rl'''方法是异步调用的,所以第二次调用在页面加载之前执行。由于脚本未被执行 – KosWarm