API 17 エミュレーターでテストされ、動作します。
Java から Web に JavaScript を注入できます。
逆に、URL が読み込まれたら、javascript から Java コードの関数を呼び出し、setVisibility()
. そのために、JS インターフェイスを追加します。
ここにコード:
private final static String HOST = "stackoverflow.com";
private WebView wb;
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_home);
wb = (WebView) findViewById(R.id.home_webview);
//Make the webview invisible
wb.setVisibility(View.INVISIBLE);
WebSettings webSettings = wb.getSettings();
webSettings.setJavaScriptEnabled(true);
wb.setWebViewClient(new WebViewClient(){
public void onPageFinished(WebView view, String url){
//Inject javascript code to the url given
//Not display the element
wb.loadUrl("javascript:(function(){"+"document.getElementById('Id').style.display ='none';"+"})()");
//Call to a function defined on my myJavaScriptInterface
wb.loadUrl("javascript: window.CallToAnAndroidFunction.setVisible()");
}
});
//Add a JavaScriptInterface, so I can make calls from the web to Java methods
wb.addJavascriptInterface(new myJavaScriptInterface(), "CallToAnAndroidFunction");
wb.loadUrl("http://"+HOST);
}
public class myJavaScriptInterface {
@JavascriptInterface
public void setVisible(){
runOnUiThread(new Runnable() {
@Override
public void run() {
wb.setVisibility(View.VISIBLE);
}
});
}
}
この機能は、すべてのページに対して実行されます。サードパーティのサーバーにアクセスしたら、すべてのリクエストをどう処理するかを管理する必要がありwebClient.shouldOverrideUrlLoading()
ます。
更新された回答:
あなたがコメントしたように、私たちが行うべき最後のバージョンのためにそれを再現することができました:
Android 4.2 以降では、ホストされている JavaScript からアクセスできるようにするには、パブリック メソッドに @JavascriptInterface で明示的にアノテーションを付ける必要があります。これも、アプリの minSdkVersion または targetSdkVersion を 17 以上に設定した場合にのみ有効になることに注意してください。
追加してインポートしましたandroid.webkit.JavascriptInterface
参照: WebViews の JavascriptInterface メソッドに注釈を付ける必要があります