11

WebChromeClient の onJsAlert 動作を次のようにオーバーライドしました。

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

私のアプリケーションは Js アラートを正常に処理し、元のアラートを抑制しました。ただし、アラート イベントの後、Web ビューの Web ページのボタン (リスト ビューのリスト項目内) をクリックできなくなりました。現在、jquery モバイルを使用して Web を構築しています。

他に知っておくべきことはありますか?

4

3 に答える 3

2

私も同様の問題に直面しましたが(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のダイアログを適切に機能させるためにキャンセル リスナーを常に定義する必要があるのか​​はわかりません。

于 2016-02-08T18:06:41.833 に答える