2013-04-09 4 views
8

devo ignorare il comportamento di mio onJsAlert WebChromeClient come:Android WebView dopo onJsAlert rubinetti che non rispondono

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

mia applicazione gestire con successo le segnalazioni Js e soppresso l'avviso originale. Tuttavia, dopo l'evento di avviso, non riesco a cliccare a lungo i miei pulsanti (in lista-elementi di listview) sulla pagina web nella mia webview. Attualmente sto usando jquery mobile per costruire il mio web.

C'è qualcos'altro che dovrei sapere?

+0

Appena affrontato lo stesso problema, vedere la soluzione sotto – RMalke

risposta

16

Ho appena affrontato lo stesso identico problema. Ho voluto generare una finestra di dialogo Android personalizzato anziché l'avviso, a questo è la soluzione finale:

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; 
    } 
}); 

La chiave è la result.cancel(); e return true;, ho provato in varie combinazioni, e l'unico che non ha sparato il predefinito avviso JS E non ha causato il problema tocco era questa combinazione

metodo
+0

grazie, proverò più tardi –

+1

Grazie mille per aver postato questo! –

+0

Anche la chiamata a result.comfirm() funziona. E penso che dovresti chiamare result.confirm() nel blocco del metodo onClick. E ovviamente dovresti rendere il risultato del parametro del metodo come finale. – androidyue

1

si dovrebbe chiamare result.confirm(), la mia soluzione è:

 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

ho anche affrontato il problema simile (ma con onJsPrompt in mio cas e) e la soluzione suggerita non ha funzionato per me. Ho già ricevuto le chiamate a result.cancel()/result.confirm() e return true dal gestore. La chiave per la correzione è stata trovata nel codice sorgente di JsDialogHelper.

Questa era la linea che ho notato per risolvere il mio problema:

builder.setOnCancelListener(new CancelListener()); 

Il codice del gestore completo:

@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; 
    } 

dove CancelListener può essere definito come una semplice classe stub:

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(); 
    } 
}  

Non sono sicuro se si tratta di un bug in WebView, oppure è richiede di avere sempre un listener di annullamento definito per mantenere il corretto funzionamento delle finestre di dialogo della webview.