如何在Android WebView中删除标题? (加载时)

时间:2017-12-16 08:45:31

标签: javascript android android-layout android-webview

我想删除android'WebView'中网站的标题。有了我的代码,它就有效。但问题是'WebView'在完全加载页面后删除了标题。我想删除它,而它正在加载。

这是代码片段:

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);" +
                        "})()");
            }
        });

4 个答案:

答案 0 :(得分:4)

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

让我们了解它是如何可能的,在我的情况下,我在webview中加载了url,看起来像下面的屏幕截图,

enter image description here

  

现在从上面的视图中我们是否要删除标题和菜单   网页的一部分。我们需要在帮助下使用 JSOUP lib   你可以删除不必要的网页部分。

<强> STEPS

  1. 在app level build gradle中添加jsoup lib

      

    编译'org.jsoup:jsoup:1.10.3'

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

      

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

         

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

         

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

  3. 我已经在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);
                }
            });
        }
    }
    

    }

    现在,是时候看结果了,

    enter image description here

答案 1 :(得分:4)

最简单的方法是在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();
                }

            }
}

答案 2 :(得分:1)

使用onPageStarted方法代替onPageFinished

来自Android文档here

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

答案 3 :(得分:1)

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);