onJsAlert之后Android webview不响应点击

我已经覆盖了我的WebChromeClient的onJsAlert行为,如:

WebChromeClient wvcc = new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { //... return true; } } 

我的应用程序成功地处理了Js警报,并抑制了原来的警报。 但是,在警报事件之后,我无法在webview中的web页面上长按我的button(在listview的列表项中)。 我目前正在使用jQuery手机来build立我的网站。

还有什么我应该知道的?

Solutions Collecting From Web of "onJsAlert之后Android webview不响应点击"

我只是面对同样的问题。 我想生成一个自定义的android对话框,而不是警报,这是最终的解决scheme:

 myWebView.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, final String url, String message, JsResult result) { AlertDialog.Builder builder = new AlertDialog.Builder( MainActivity.this); builder.setMessage(message) .setNeutralButton("OK", new OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { arg0.dismiss(); } }).show(); result.cancel(); return true; } }); 

关键是result.cancel();return true; ,我testing了几种组合,并且唯一一个没有触发默认的JS警报并没有造成触摸问题的是这种组合

我也面临类似的问题(但在我的情况下onJsPrompt ),并build议的解决scheme不适合我。 我已经有了调用result.cancel()/result.confirm()并从处理程序return true 。 修复的关键是在JsDialogHelper的源代码中JsDialogHelper

这是我发现解决我的问题的路线:

 builder.setOnCancelListener(new CancelListener()); 

完整的处理程序代码:

  @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) { final EditText data = new EditText(view.getContext()); AlertDialog.Builder b = new AlertDialog.Builder(view.getContext()) .setTitle(view.getTitle()) .setView(data) .setMessage(message) .setOnCancelListener(new CancelListener(result)) // if this line is missing, WebView remains unresponsive after the dialog is shown and closed once .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.confirm(data.getText().toString()); } }) .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.cancel(); } }); b.show(); return true; } 

其中CancelListener可以被定义为一个简单的存根类:

 private class CancelListener implements DialogInterface.OnCancelListener, DialogInterface.OnClickListener { CancelListener(JsResult result) { mResult = result; } private final JsResult mResult; @Override public void onCancel(DialogInterface dialog) { mResult.cancel(); } @Override public void onClick(DialogInterface dialog, int which) { mResult.cancel(); } } 

我不确定这是否是WebView中的错误,或者是否需要定义一个取消侦听器来保持webview的对话框正常工作。

你应该调用result.confirm()方法,我的解决scheme是:

  public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { Log.i("MainActivity", "onJsAlert url=" + url + ";message=" + message); Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); result.confirm(); return true; }