我有加载一些页面的 WebView,当它完成时,我应用一些 javascript 魔法来搞乱 DOM。一切都很好,页面加载并且
onPageFinished
我只是打电话给wv.loadUrl(javascript);
但是我不想看到加载过程,以及 JavaScript 是如何工作的,我只需要结果,所以我从一开始就用
wv.setVisibility(View.INVISIBLE);
使我的视图不可见,并在一切完成后使其再次可见。这就是问题发生的地方。
这段代码应该使视图在 javascript 完成后可见,但
wv.setVisibility(View.VISIBLE)
在 javascript 之前触发。因此,我暂时看到了页面以及它是如何被 javascript 更改的。这太丑了。
public void onPageFinished (WebView view, String url) {
wv.loadUrl(javascript);
view.getSettings().setLoadsImagesAutomatically(true);
wv.setVisibility(View.VISIBLE);
}
我发现loadUrl是异步工作的,所以我尝试在
onPageFinished
中使用“使第一个视图可见”方法创建另一个WebViewClient,并用它来调用JS。但它总是因 NPE 错误而崩溃。
wv2.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished (WebView view, String url) {
wv.setVisibility(View.VISIBLE);
}
});
现在我只是在 javascript 之后添加了延迟(
SystemClock.sleep(5000)
),但这就像......是的。
我认为您不会找到简单的解决方案。 Android 可以检测到(像大多数浏览器一样)的是页面何时完全加载,这意味着所有页面都已下载。 JavaScript 也会等待它被下载,然后开始运行。这就是它的工作原理。我能想到的唯一解决方案可能就是 JQuery。我对此了解不多,但里面通常有类似问题的解决方案。
Совет。
wv.setVisibility(View.INVISIBLE)
оставляет в макете место под этот элемент, то есть если ниже него есть другие элементы, они смещаются。 Это может выглядеть некрасиво
Я всегда ставлю свойство GONE
,это не мешает загружать страницы,а по окончании загрузки ставить VISIBLE