我也遇到了类似的问题(但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 中的错误,或者是否需要始终定义取消侦听器以保持 webview 的对话框正常工作。