studio formularios formulario ejemplo diseño dinamicos android forms post webviewclient

formularios - retrofit android



Android: cómo interceptar un formulario POST en Android WebViewClient en el nivel 4 de API (3)

¿De verdad necesitas usar un POST? Si desea manejar formdata localmente, ¿por qué no tener una pieza de javascript que maneja su formulario e interfaz con el código java "nativo" usando addJavascriptInterface? P.ej

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

Su bridge puede ser básicamente de cualquier clase y debería poder acceder a sus métodos directamente desde javascript. P.ej

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

Su html / javascript podría verse así:

<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>

Tengo un WebViewClient conectado a mi WebView así:

webView.setWebViewClient(new MyWebViewClient());

Aquí está mi implementación de MyWebViewClient :

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

Le doy a WebView una URL para cargar a través de loadUrl() . Si tengo un enlace ( a href... ) en la página, se llama a mi método shouldOverrideUrlLoading y puedo interceptar el clic del enlace.

Sin embargo, si tengo un formulario cuyo método es POST , no se llama al método shouldOverrideUrlLoading .

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

¿Qué puedo hacer si estoy en el nivel 4 de la API? ¿Hay alguna otra forma de interceptar publicaciones de formularios?


Creo que puede anular onLoadResource(WebView view, String url) desde WebViewClient . Esta función se agrega en API NIVEL 1.

Se llama a esta función cuando WebView cargará el recurso especificado por la url dada. El recurso incluye js , css , iframe embeded 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))); } }


Este es un problema conocido, que shouldOverrideUrlLoading no shouldOverrideUrlLoading POST. Consulte http://code.google.com/p/android/issues/detail?id=9122 para obtener más información.

Use GET! Personalmente traté de usar POST, porque esperaba alguna limitación de los parámetros GET (es decir, la longitud de la URL), pero pasé con éxito 32000 bytes a través de GET localmente sin ningún problema.