Android WebView addJavascriptInterface не работает, если webview создается в обратном вызове WebChromeClient # onCreateWindow

Ниже приведен мой тестовый код. Моя проблема в том, что на второй странице я не могу ссылаться на AndroidFunction2 . Я тестирую это на Nexus 7 с Android 4.4. Но это нормально для sumsang i9100 с Android 4.0. Я что-то делаю неправильно, или есть ошибка Android?

Основная деятельность

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> 

Solutions Collecting From Web of "Android WebView addJavascriptInterface не работает, если webview создается в обратном вызове WebChromeClient # onCreateWindow"

Даже у меня была такая же проблема, и после того, как я снова просмотрел документы, я обнаружил, что если вы настроили targetSdkVersion на 17 or higher , вы должны добавить аннотацию @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"); 

А затем вызывать из HTML внутри WebView как

 <input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /> <script type="text/javascript"> function showAndroidToast(toast) { Android.showToast(toast); } </script>