Я также столкнулся с подобной проблемой (но с onJsPrompt
в мой cas д), и предлагаемое решение не сработало для меня. У меня уже были звонки 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, или это требуется, чтобы всегда иметь прослушиватель отмены, предназначенный для правильной работы диалоговых окон веб-просмотра.
Только что столкнулся с тем же вопросом, см. Решение ниже – RMalke