2013-04-09 3 views
8

меня переопределить onJsAlert поведение моего WebChromeClient как:Android WebView после onJsAlert не реагирующих кранами

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

мое приложение успешно обрабатывать предупреждения Js и подавляли оригинальный сигнал. Однако после события предупреждения я не могу долго нажимать на мои кнопки (в списках элементов списка) на веб-странице в своем веб-просмотре. В настоящее время я использую jquery mobile для создания своего веб-сайта.

Есть ли что-нибудь еще, о чем я должен знать?

+0

Только что столкнулся с тем же вопросом, см. Решение ниже – RMalke

ответ

16

Я столкнулся с такой же проблемой. Я хотел, чтобы создать пользовательский андроид диалог вместо предупреждения, чтобы это окончательное решение:

myWebView.setWebChromeClient(new WebChromeClient() { 
    @Override 
    public boolean onJsAlert(WebView view, final String url, String message, 
      JsResult result) { 

     AlertDialog.Builder builder = new AlertDialog.Builder(
       MainActivity.this); 
     builder.setMessage(message) 
       .setNeutralButton("OK", new OnClickListener() { 
        @Override 
        public void onClick(DialogInterface arg0, int arg1) { 
         arg0.dismiss(); 
        } 
       }).show(); 
     result.cancel(); 
     return true; 
    } 
}); 

Ключ result.cancel(); и return true;, я испытал в нескольких комбинациях, и только один, который не уволил по умолчанию JS оповещений и не вызвали прикосновение проблемы этого сочетания

метода
+0

спасибо, я попробую его позже –

+1

Большое вам спасибо за сообщение об этом! –

+0

Вызов result.comfirm() также работает. И я думаю, вы должны вызвать result.confirm() в блоке метода onClick. И, конечно же, вы должны сделать результат параметра метода окончательным. – androidyue

1

вы должны вызвать result.confirm(), мое решение:

 public boolean onJsAlert(WebView view, String url, String message, 
       final JsResult result) { 
      Log.i("MainActivity", "onJsAlert url=" + url + ";message=" + message); 
      Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); 
      result.confirm(); 
      return true; 
     } 
2

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

Смежные вопросы