6

我有一个网络视图

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 就完成了。

任何人?

附言。该网站不是我的,它是第 3 方网站

4

2 回答 2

15

在 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 方法

于 2013-05-06T12:39:17.767 回答
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);
                }
            });
        }
    }

在使 webview 可见之前,我添加了半秒的延迟。

于 2018-11-12T14:18:07.723 回答