安卓 解决方案Android知识Android技术知识

webview获取网页title

2016-10-25  本文已影响1997人  24K纯帅豆

序言

今天做项目的时候,老大让我把之前做的webview打开网页的功能修改一下,说是要动态的获取网页的标题,然后显示在我们自己app的标题栏上,然后我就屁颠屁颠的跑去看webview的源码,看看有没有获取标题这个方法。

需求:这个是我在Activity中放的一个webview,上面一个title,然后当我点击网页中的链接的时候,我希望页面的title也会跟着改变,当我返回的时候,我也希望title变回当前网页的title

一、首先,webview的加载在这里我们就不多说了,往上有很多这样的例子,如果还不清楚的,请看Webview合集 - 简书

二、然后我们需要获取网页的title

1、在webview中有一个组件,叫做WebChromeClient,这个组件是用来协助Webview处理Js的一些东西的,比如说网站的图标,网站的title,网站的加载进度等等,所以我们可以用这个来获取title。实现它里面的onReceivedTitle这个方法即可:

WebChromeClient wcc = new WebChromeClient() {
    @Override
    public void onReceivedTitle(WebView view, String title) {
        super.onReceivedTitle(view, title);
        tvTitle.setText(title);
    }
};

获取这个title就可以了,可能有人要说了,你都没有跟你访问的url关联起来,它怎么就能获取title了,难不成他还能上天不成,别急嘛!咱后面还有呢!

2、在webview中还有另外一个组件,叫做WebViewClient,这个组件主要用来辅助webview处理一些简单的html页面内容,比如各种通知,请求事件等等,也就是说在用这个组件你可以监听网页加载是否完成,是否开始等等,然后还有就是可以设置是否在外部浏览器中浏览:

mWebView.setWebViewClient(new WebViewClient() {  
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return false;
    }
});

在执行完这个组件之后我们再来绑定我们的url:

mWebView.loadUrl(url);

好了,现在就可以实时的更换你的title了,但是这里还有一个bug,当然了,这不是我的bug,是WebChromeClient的bug,按返回键的时候,是不会执行onReceivedTitle这个方法的,所以返回的时候title就不会动态的改变了,后来百度到有方法可以让他动态的改变,那就是自己维护,何为自己维护呢:

就是自己创建一个栈,也就是list,来动态添加,删除你浏览的网页

好了,方法有了,咱们来实践一下

private List<String> loadHistoryUrls=new ArrayList<>();

然后我们在刚才WebViewClient那里增加一个方法,onPageFinished,因为每次打开新的网页,完成之后都会执行这个方法:

@Override
public void onPageFinished(WebView view, String url) {
    loadHistoryUrls.add(url);
}

那我们在哪里删除呢?当然是返回的地方啊:

/**
 * 改变返回键的功能,当网页中有需要返回的界面时,网页中优先
 *
 * @param keyCode
 * @param event
 * @return
 */
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        if (mWebView.canGoBack()) {
            if (loadHistoryUrls.size() > 1) {
                //重新加载之前的页面,这里为了让标题也能正常显示
                String url = loadHistoryUrls.get(loadHistoryUrls.size() - 2);
                loadHistoryUrls.remove(loadHistoryUrls.size() - 1);
                if (loadHistoryUrls.size() > 0) {
                    loadHistoryUrls.remove(loadHistoryUrls.size() - 1);
                }
                mWebView.loadUrl(url);
                return true;
            }
        }
    }
    return super.onKeyDown(keyCode, event);
}

好了,到这里我们就维护好了标题实时改动了,我们来看看效果吧!

公众号:Android技术经验分享
上一篇下一篇

猜你喜欢

热点阅读