在 API 17 模拟器上测试,它可以工作。
您可以将 Java 中的 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);
}
});
}
}
此功能将为每个页面执行。一旦在第 3 方服务器上,您必须管理如何处理每个请求,这webClient.shouldOverrideUrlLoading()
可以为您提供帮助。
更新的答案:
我可以按照您的评论复制它,对于我们应该做的最后一个版本:
从 Android 4.2 开始,您现在必须使用 @JavascriptInterface 显式注释公共方法,以使它们可以从托管的 JavaScript 访问。请注意,这也仅在您将应用的 minSdkVersion 或 targetSdkVersion 设置为 17 或更高时才会生效。
我添加并导入android.webkit.JavascriptInterface
参考:现在必须注释 WebViews 中的 JavascriptInterface 方法