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