onReceivedTitle()不被调用问题解决

来源:互联网 发布:mac版枪火兄弟连2 编辑:程序博客网 时间:2024/06/08 19:17

情景说明

今天在写一个WebView界面,该Webview中有两层网页跳转,跳转后更新ActionBar中的标题。测试时发现三星手机在WebView回退(即:goBack())后ActionBar中的Title不更新,而Nexus6p Android7.0可以更新Title。Debug后找发现是由三星手机在WebView回退时不会调用WebChromeClient.onReceivedTitle()方法造成的。

解决思路

由于WebChromeClient.onReceivedTitle()只在回退时不会调用且WebView.getTitle()返回null(见源码),我们可以讲每层的Title存储在List中,当WebView回退时使用List中最后一个元素设置ActionBar的Title。

代码流程

1.自定义WebView
public class MyWebView extends WebView{    ...    // 用于存储每层web的标题    private List<String> titles =  new ArrayList<>() ;    public MyWebView (Context context){        super(context) ;        ...        setWebChromeClient(new WebChromeClient(){            // 用于存储webview内跳转的title,在webchromeclient中处理,因getTitle()返回null            // 非回退时(包括三星手机)webChromeClient.onReceivedTitle()会被调用,            // 所以在这里存储处理标题            @Override            public void onReceivedTitle(WebView view, String title) {                titles.add(title) ;                ...            }        });    }    /**     * 由于系统默认返回null,这里覆写以返回真实的Title     * @return     */    @Override    public String getTitle() {        ...        if(titles.size() > 0){            return titles.get(titles.size() - 1) ;        }else {            return "" ;        }    }    /**     * webview回退时应该删除存储的最后一个标题     */    @Override    public void goBack() {        ...        if(titles.size() > 0){            titles.remove(titles.size() - 1) ;        }        super.goBack();    }}
2.Activity中监听回退操作
由于Activity中操作比较灵活回退的方法有多种如:ActionBar左上角的回退按钮,onKeyDown,onBackPressed等,所以这里不贴代码了,直接写操作思路:当触发回退时,首先判断WebView是否可以回退,如果WebView可以回退,actionBarTitle.setText(mWebView.getTitle()) ;// 这里是覆写后的getTitle() 否则销毁Activity即可。

答复

1.1楼答复
在onPageFinished通过webView.getTitle()不一定可行,例如:在Android api 22(更低的版本没有看)的代码中WebView是这样处理的:

这里写图片描述

标题直接返回null ;而在Android api 24中WebView是这样处理的:

这里写图片描述

可见Google修复了这个问题,为了更好的兼容性,还是自己控制标题吧,反正方法都是覆写的原方法,使用感觉是一样的。
0 0
原创粉丝点击