Android - как перехватить сообщение формы в android WebViewClient на уровне API 4
у меня есть WebViewClient
прикрепленный к моему WebView
вот так:
webView.setWebViewClient(new MyWebViewClient());
вот моя реализация MyWebViewClient
:
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
webView.loadUrl(url);
return true;
}
}
Я даю WebView
URL для загрузки через loadUrl()
. Если у меня есть ссылка (a href...
) на странице моя shouldOverrideUrlLoading
вызывается метод, и я могу перехватить щелчок ссылки.
однако, если у меня есть форма, метод которой POST
на shouldOverrideUrlLoading
метод не вызывается.
я заметил аналогичную проблему здесь: http://code.google.com/p/android/issues/detail?id=9122 это наводит на мысль наиважнейшая postUrl
в своем WebView
. Однако этот API доступен только начиная с уровня API 5.
что я могу сделать, если я на уровне API 4? Есть ли другой способ перехватить сообщения формы?
3 ответов
Это известная проблема, что shouldOverrideUrlLoading
не поймать сообщение. См.http://code.google.com/p/android/issues/detail?id=9122 для деталей.
используйте GET! Я лично пробовал использовать POST, потому что ожидал некоторого ограничения параметров GET (т. е. длины URL), но я просто успешно прошел 32000 байт через GET локально без каких-либо проблем.
вам действительно нужно использовать сообщение? Если вы хотите обрабатывать formdata локально, почему бы не иметь фрагмент javascript для обработки вашей формы и интерфейса с "родным" java-кодом с помощью addJavascriptInterface. Е. Г.
WebView engine = (WebView) findViewById(R.id.web_engine);
engine.getSettings().setJavaScriptEnabled(true);
engine.addJavascriptInterface(new MyBridge(this), "bridge");
engine.loadUrl(...)
ваш мост может быть любым классом в основном, и вы должны иметь доступ к его методам непосредственно из javascript. Е. Г.
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();
}
ваш html / javascript может выглядеть так:
<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>
Я думаю, вы можете переопределить onLoadResource(WebView view, String url)
С WebViewClient
. Эта функция добавлена в API уровня 1.
эта функция вызывается, когда WebView
загрузит ресурс, указанный по заданному url-адресу. Ресурс включает js
, css
, iframe
встроенный url. Пример кода:
@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)));
}
}