以下是我的测试代码.我的问题是在第二页我无法引用
AndroidFunction2.我正在使用Android 4.4在Nexus 7上进行测试.但是,搭载Android 4.0的sumsang i9100还可以.
我做错了,还是有一个Android的bug?
我做错了,还是有一个Android的bug?
主要活动
public class MainActivity extends Activity { WebView mWebView1; WebView mWebView2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final FrameLayout mainFrame = (FrameLayout) this.findViewById(R.id.mainFrame); mWebView1 = new WebView(this); mWebView1.getSettings().setJavaScriptEnabled(true); mWebView1.getSettings().setSupportMultipleWindows(true); mWebView1.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view,String url) { return false; } }); mWebView1.setWebChromeClient(new WebChromeClient() { @Override public boolean onCreateWindow(WebView view,boolean isDialog,boolean isUserGesture,Message resultMsg) { mWebView2 = new WebView(MainActivity.this); mWebView2.getSettings().setJavaScriptEnabled(true); mWebView2.getSettings().setSupportMultipleWindows(true); mWebView2.setWebChromeClient(new WebChromeClient() { @Override public void onConsoleMessage(String message,int lineNumber,String sourceID) { Log.d("WebView","Line: " + lineNumber + "," + message); } }); mWebView2.addJavascriptInterface(new Object() { @JavascriptInterface public void hello2() { } },"AndroidFunction2"); (( WebViewTransport )resultMsg.obj).setWebView(mWebView2); resultMsg.sendToTarget(); mainFrame.addView(mWebView2); return true; } }); mWebView1.addJavascriptInterface(new Object() { @JavascriptInterface public void hello1() { } },"AndroidFunction1"); mWebView1.loadUrl("file:///sdcard/test_1.html"); mainFrame.addView(mWebView1); } }
而两个网页,test_1.html:
<html> <body> <a href="test_2.html" target="_blank">goto test 2</a> <div><a href="javascript:alert(typeof AndroidFunction1);"> alert(typeof AndroidFunction1);</a> </div> <div><a href="javascript:alert(typeof window.AndroidFunction1);"> alert(typeof window.AndroidFunction1);</a> </div> </body> </html>
test_2.html
<html> <body> <div><a href="javascript:alert(AndroidFunction2);"> alert(AndroidFunction2);</a> </div> <div><a href="javascript:alert(typeof window.AndroidFunction2);"> alert(typeof window.AndroidFunction2);</a> </div> </body> </html>
解决方法
即使我有同样的问题,并且在再次通过文档之后,我发现如果您将targetSdkVersion设置为17或更高版本,则必须将@JavascriptInterface注释添加到您希望可用于JavaScript的任何方法(该方法也必须公开).
如果您不提供注释,则在Android 4.2或更高版本上运行时,您的网页无法访问该方法.
以下示例(摘自http://developer.android.com/guide/webapps/webview.html)表明您可以在Android应用程序中包含以下类:
public class WebAppInterface { Context mContext; /** Instantiate the interface and set the context */ WebAppInterface(Context c) { mContext = c; } @JavascriptInterface // must be added for API 17 or higher public void showToast(String toast) { Toast.makeText(mContext,toast,Toast.LENGTH_SHORT).show(); } }
并绑定为
WebView webView = (WebView) findViewById(R.id.webview); webView.addJavascriptInterface(new WebAppInterface(this),"Android");
然后从WebView中的HTML调用
<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /> <script type="text/javascript"> function showAndroidToast(toast) { Android.showToast(toast); } </script>