2017-03-07 44 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