tôi cũng phải đối mặt với vấn đề tương tự (nhưng với onJsPrompt
trong cas của tôi e) và giải pháp được đề xuất không hiệu quả đối với tôi. Tôi đã có các cuộc gọi tới số result.cancel()/result.confirm()
và return true
từ trình xử lý. Chìa khóa để sửa chữa được tìm thấy trong mã nguồn của JsDialogHelper
.
Đây là dòng mà tôi phát hiện để giải quyết vấn đề của tôi:
builder.setOnCancelListener(new CancelListener());
Mã xử lý hoàn tất:
@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;
}
nơi CancelListener
thể được định nghĩa như là một lớp còn sơ khai đơn giản:
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();
}
}
Tôi không chắc đây có phải là lỗi trong WebView hay không yêu cầu để luôn có trình xử lý hủy được xác định để giữ cho hộp thoại của chế độ xem web hoạt động bình thường.
Chỉ cần đối mặt với cùng một khả năng, xem giải pháp dưới đây – RMalke