私も同様の問題に直面しましたが(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;
}
whereCancelListener
は単純なスタブ クラスとして定義できます。
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のダイアログを適切に機能させるためにキャンセル リスナーを常に定義する必要があるのかはわかりません。