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メソッドが呼び出され、リンクのクリックをインターセプトできます。

ただし、メソッドが であるフォームがある場合POSTshouldOverrideUrlLoadingメソッドは呼び出されません。

ここで同様の問題に気付きました: 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を参照してください。

GETを使おう!GET パラメータ (つまり URL の長さ) に何らかの制限があると予想していたので、私は個人的に POST を使用してみましたが、問題なくローカルで GET を介して 32000 バイトを渡すことができました。

于 2012-07-19T13:53:46.437 に答える