私は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
にloadUrl()
を介してロードするURLを指定します。ページにリンク(_a href...
_)がある場合、shouldOverrideUrlLoading
メソッドが呼び出され、リンクのクリックをインターセプトできます。
ただし、メソッドがPOST
のフォームがある場合、shouldOverrideUrlLoading
メソッドは呼び出されません。
ここで同様の問題に気づきました: http://code.google.com/p/Android/issues/detail?id=9122postUrl
を上書きすることを提案しているようですWebView
。ただし、このAPIはAPIレベル5以降でのみ使用できます。
APIレベル4の場合はどうすればよいですか?フォームの投稿を傍受する方法は他にありますか?
これは既知の問題であり、shouldOverrideUrlLoading
がPOSTをキャッチしません。詳細は http://code.google.com/p/Android/issues/detail?id=9122 を参照してください。
GETを使用してください! GETパラメータの制限(URLの長さなど)を期待していたため、個人的にPOSTを使用してみましたが、問題なくローカルでGETを介して32000バイトを正常に渡しただけです。
本当にPOSTを使用する必要がありますか? 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>