Tengo un WebViewClient conectado a mi WebView así:

webView.setWebViewClient(new MyWebViewClient());

Aquí está mi aplicación de MyWebViewClient:

private class MyWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
      webView.loadUrl(url);
      return true;
    }    
}

Doy la WebView una dirección URL para cargar a través de loadUrl(). Si tengo un enlace (a href...) en la página, mi shouldOverrideUrlLoading método es llamado y me puede interceptar el vínculo haga clic en.

Sin embargo, si tengo un formulario cuyo método es POST, el shouldOverrideUrlLoading método no es llamado.

Me di cuenta de un problema similar aquí: http://code.google.com/p/android/issues/detail?id=9122 que parece sugerir primordial postUrl en mi WebView. Sin embargo, esta API está disponible sólo a partir de la API de nivel 5.

¿Qué puedo hacer si estoy en la API de nivel 4? ¿Hay alguna otra manera para intercepto puestos?

  • Usted puede tratar de reemplazar onPageStarted de devolución de llamada en el WebViewClient.
  • Gracias. Lo probé y funciona bien, pero el problema es que no quiero que el formulario de la página de carga es una URL falsa así que me acaban de obtener el webview página de error. He trabajado alrededor de esta comprobando en onPageStarted si la URL coincide con mi forma de URL, y si es así, controlar esta en mi aplicación y, a continuación, dígale a la webViewClient a volver. ¿Suena razonable?
  • Encontraste una solución a esto?
InformationsquelleAutor manisha | 2010-09-08

3 Comentarios

  1. 4

    Este es un problema conocido, que shouldOverrideUrlLoading no de capturas en el POST. Ver http://code.google.com/p/android/issues/detail?id=9122 para más detalles.

    El uso de CONSEGUIR!!! Yo personalmente probado usando POST, porque me espera una cierta limitación de los parámetros GET (es decir, longitud de la URL), pero sólo me pasa con éxito 32000 bytes a través de CONSEGUIR localmente sin ningún tipo de problemas.

    • Realmente necesito encontrar la solución a esto. Porque, en mi caso, no está en mis manos para cambiar a OBTENER, en realidad. No puedo entender cómo es que se perdió en android. ¿Cuál fue la razón.
    • Reemplazar postUrl en webView. Esta disponible a partir de la API de nivel 5.
    • Yo lo hice, sin éxito. No manejo.
    • También estoy en la necesidad de una solución para esto. Necesito agregar un encabezado personalizado a todas las solicitudes de salir a través de mi WebView. Yo la primera carga en una dirección url que redirige (a través de correo wheee!) a otra página, y yo soy incapaz de captar que redirigir correctamente y agregar el encabezado personalizado. No tengo control sobre el servidor y el hecho de que es el uso de un POST en lugar de GET.
  2. 3

    ¿Usted realmente necesita usar un POST? Si desea controlar el objeto formdata a nivel local, ¿por qué no tener un pedazo de javascript manejar su forma y la interfaz con los «nativos» código java con addJavascriptInterface. E. g.

    WebView engine = (WebView) findViewById(R.id.web_engine);       
    engine.getSettings().setJavaScriptEnabled(true); 
    engine.addJavascriptInterface(new MyBridge(this), "bridge");
    engine.loadUrl(...)

    Su puente puede ser de cualquier clase, básicamente, y usted debería ser capaz de acceder a sus métodos directamente desde javascript. E. g.

    public class MyBridge {
    
        public MyBridge(Context context) {
             //...
        }
    
        public String doIt(String a, String b) {
                JSONArray result = new JSONArray();
                result.put("Hello " + a);
                result.put("Hello " + b);
                return result.toString();       
        }

    Tu html /javascript podría parecerse a:

    <script type="text/javascript">
        $("#button").click(function() {
            var a = $("#a").val();
            var b = $("#b").val();
    
            var result=JSON.parse(bridge.doIt(a, b));
            //...
        }
    </script>
    
    <input id="a"><input id="b"><button id="button">click</button>
    • Esa es la solución ideal, pero lamentablemente no parece funcionar en el 2,3 emulador y varios teléfonos de esa generación. Buscar VM se bloquea con el siguiente error: JNI ADVERTENCIA: jarray 0x40533560 puntos a los no-objeto array (Ljava/lang/String;) Google para obtener más información
  3. -2

    Creo que se puede reemplazar onLoadResource(WebView view, String url) de WebViewClient. Esta función se Añadió en la API de NIVEL 1.

    Se llama a esta función cuando WebView se carga el recurso especificado por la url dada. Los recursos incluyen js, css, iframe incrustadas url. Ejemplo de código como este:

        @Override
        public void onLoadResource(WebView view, String url) {
            if (url.indexOf("http://www.example.com") != -1 && view != null) {
                //open url in default browser
                view.stopLoading();
                view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
            }
        }
    • En la pregunta se pidió a interceptar la petición POST no intentar la carga de recursos. Ambos son diferentes.
    • Para aquellos que añade desventajas para esta respuesta: según el estándar de HTTP, «recurso» no es sólo archivo (js, css y así sucesivamente). «Recurso» es algo URI puntos. E. g., API extremos de los recursos.

Dejar respuesta

Please enter your comment!
Please enter your name here