30

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,我该怎么办?有没有其他方法可以拦截表单帖子?

4

3 回答 3

5

你真的需要使用 POST 吗?如果您想在本地处理表单数据,为什么不让一段 javascript 使用 addJavascriptInterface 处理您的表单并与“本机”java 代码接口。例如

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>
于 2010-10-13T11:03:46.287 回答
4

这是已知问题,shouldOverrideUrlLoading不会捕获 POST。有关详细信息,请参阅http://code.google.com/p/android/issues/detail?id=9122

使用获取!我个人尝试使用 POST,因为我预计 GET 参数会有一些限制(即 URL 的长度),但我只是在本地通过 GET 成功传递了 32000 个字节,没有任何问题。

于 2012-07-19T13:53:46.437 回答
-3

我认为您可以覆盖onLoadResource(WebView view, String url)from WebViewClient。此功能在 API LEVEL 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)));
        }
    }
于 2014-09-05T02:17:15.940 回答