我有一个webview
WebView wv;
wv = (WebView)findViewById(R.id.webView1);
wv.loadUrl("http://example.com/");
简单地说。
在:
onPageFinished
我有:
wv.loadUrl("javascript:(function() { " + "document.getElementsByClassName('centered leaderboard_container')[0].style.display = 'none'; " + "document.getElementsByClassName('n')[0].style.display = 'none'; " + "document.getElementsByClassName('paginator')[0].style.display = 'none'; " + "document.getElementsByTagName('ul')[0].style.display = 'none'; " + "document.getElementsByTagName('tr')[0].style.display = 'none'; " + "})()");
我已将webview可见性设置为INVISIBLE
如何在JavaScript完成后设置对VISIBLE的可见性?
现在你可以看到整个页面,而不是JavaScript完成..
任何?
PS。该网站不是我的,它是第三方网站
答案 0 :(得分:14)
在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);
}
});
}
}
将为每个页面执行此功能。进入第三方服务器后,您必须管理每项请求的操作,webClient.shouldOverrideUrlLoading()
可以为您提供帮助。
更新回答:
我可以像你评论的那样重现它,我们应该做的最后一个版本:
从Android 4.2开始,您现在必须使用@JavascriptInterface显式注释公共方法,以便从托管JavaScript中访问它们。请注意,这仅在您将应用的minSdkVersion或targetSdkVersion设置为17或更高时才会生效。
我添加了它并导入了android.webkit.JavascriptInterface
Reference: JavascriptInterface methods in WebViews must now be annotated
答案 1 :(得分:1)
我也遇到了@GromDroid的问题。
也许不是最好的解决方案,但它可行:
public class myJavaScriptInterface {
@JavascriptInterface
public void setVisible(){
runOnUiThread(new Runnable() {
@Override
public void run() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
wb.setVisibility(View.VISIBLE);
}
}, 500);
}
});
}
}
我添加了半秒的延迟,然后才能显示Web视图。