Веб-просмотр Android после того, как onJsAlert не отвечает

Я переопределяю поведение onJsAlert в WebChromeClient, например:

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

Мое приложение успешно обрабатывает предупреждения Js и подавляет исходное предупреждение. Однако после события предупреждения я не могу долго нажимать на мои кнопки (в списках элементов списка) на веб-странице в своем веб-просмотре. В настоящее время я использую jquery mobile для создания своего веб-сайта.

Есть ли что-нибудь еще, о чем я должен знать?

Я просто столкнулся с такой же проблемой. Я хотел создать собственное андроидное диалоговое окно вместо предупреждения, это окончательное решение:

 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; , Я тестировал в нескольких комбинациях, и единственный, кто не запускал предупреждение JS по умолчанию И не вызвало проблему касания, было это сочетание

Я также столкнулся с подобной проблемой (но с onJsPrompt в моем случае), и предлагаемое решение не сработало для меня. У меня уже были вызовы result.cancel()/result.confirm() и return true из обработчика. Ключ для исправления был найден в исходном коде 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, или требуется всегда иметь приемник отмены, чтобы поддерживать правильные диалоги веб-просмотра.

Вы должны вызвать метод result.confirm (), мое решение:

  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; }