【问题标题】:How to remove the header in Android WebView? (While Loading)如何删除 Android WebView 中的标题? (加载时)
【发布时间】:2017-12-16 08:45:31
【问题描述】:

我想在 android 'WebView' 中删除网站的标题。使用我拥有的代码,它可以工作。但问题是 'WebView' 在页面完全加载后删除了标题。我想在加载时删除它。

这是sn-p的代码:

webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url)
            {
                webView.loadUrl("javascript:(function() { " +
                        "var head = document.getElementsByTagName('header')[0];"
                        + "head.parentNode.removeChild(head);" +
                        "})()");

                webView.loadUrl("javascript:(function() { " +
                        "var head = document.getElementsByTagName('footer')[0];"
                        + "head.parentNode.removeChild(head);" +
                        "})()");
            }
        });

【问题讨论】:

  • 是的,它工作正常。您需要做的就是屏蔽整个屏幕,直到整个网站加载并删除它。
  • 我是 Android Studio 的新手。如何在加载时创建蒙版?是新的布局画面吗?

标签: javascript android android-layout android-webview


【解决方案1】:

ANDROID WebView-从Android中的网页中删除标题或任何标签

让我们了解这怎么可能,在我的情况下,我在 webview 中加载了 url,如下图所示,

现在从上面的视图中,如果我们要删除标题和菜单 网页的一部分。我们需要借助 JSOUP lib 您可以删除网页中不必要的部分。

步骤

  1. 在您的应用级构建 gradle 中添加 jsoup 库

    编译'org.jsoup:jsoup:1.10.3'

  2. 现在在活动中,我们将使用异步任务来解析/删除一些导致无法直接在 UI 线程上完成的网络操作的 html 标签。 Async Task 允许您执行后台操作并在 UI 线程上发布结果。它有三种常用的方法。

    onPreExecute():-用于显示进度条

    doInBackground():-这一步用于执行可能需要很长时间的后台计算。您无法在此方法中更新任何 UI。

    onPostExecute():-在后台任务完成后调用,它会更新 UI。

我已经在xml中定义了WebView,如下方式,

  <WebView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/webview"/>

在 MainActivity.java 中,我编写了 JSOUP 代码来删除网页中不必要的部分

 public class MainActivity extends AppCompatActivity {
WebView webview;
String url="http://pixelay.com/";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    webview= (WebView) findViewById(R.id.webview);
    new MyAsynTask().execute();
}

private class MyAsynTask extends AsyncTask<Void, Void, Document> {
    @Override
    protected Document doInBackground(Void... voids) {

        Document document = null;
        try {
            document= Jsoup.connect(url).get();
            document.getElementsByClass("main-navigation").remove();
            document.getElementsByClass("custom-header-image").remove();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return document;
    }

    @Override
    protected void onPostExecute(Document document) {
        super.onPostExecute(document);
        webview.loadDataWithBaseURL(url,document.toString(),"text/html","utf-8","");
        webview.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK );

        webview.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                view.loadUrl(url);
                return super.shouldOverrideUrlLoading(view, request);
            }
        });
    }
}

}

现在,是时候看看结果了,


【讨论】:

  • 感谢您的回答。我试过了,它可以工作,但是当我删除标题时,似乎还有空白,这会产生间隙,你知道我怎样才能删除那个空白吗?
  • @Yupi 我认为如果您执行检查元素并在网络上删除这些类(首先),那么您应该看到空白的来源。这样,您应该能够删除任何额外的标签。但是,如果你做到了,你能证明你是怎么做到的吗?谢谢,
  • 嗨,我使用此代码及其工作,但是当我单击任何项​​目并 webview 加载新 url 时,该 url 显示为 heaer 和页脚,请帮助我
【解决方案2】:

最简单的方法是在onLoadResource() 方法中注入Javascript。将其放在 try-catch 块中,因为 WebView 在加载之前不会知道该元素:

webView.setWebChromeClient(new WebChromeClient() {
           ...

            @Override
            public void onLoadResource(WebView view, String url) {

                try {
                    webView.loadUrl("javascript:(window.onload = function() { " +
                            "(elem1 = document.getElementById('id1')); elem.parentNode.removeChild(elem1); " +
                            "(elem2 = document.getElementById('id2')); elem2.parentNode.removeChild(elem2); " +
                            "})()");
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
}

【讨论】:

  • @Sinan 很高兴我能帮上忙 :)
  • 目前,WebChromeClient 没有onLoadResource 。请改用WebViewClient
【解决方案3】:
public class YourwebView extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        view.loadUrl(request.getUrl());
        return true;
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        view.loadUrl("javascript:var footer = document.getElementById(\"footer\"); footer.parentNode.removeChild(footer); var header = document.getElementById(\"header-full\"); header.parentNode.removeChild(header);");
    }

}

还要确保你已经启用了 javscript

YourwebView myWebClient = new YourwebView();
webview.setWebViewClient(myWebClient);
WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);

【讨论】:

  • 我试过这个。但是之后出现了错误,找不到方法
  • 成功了。但是在webView完全加载后,它又显示了header
【解决方案4】:

使用onPageStarted 方法代替onPageFinished

来自 Android 文档here

编辑:阅读其他答案的 cmets,我看到您希望标题再次显示。只需实现onPageStartedonPageEnded,将标题隐藏在一个中,然后在另一个中再次显示。

【讨论】:

    猜你喜欢
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多