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
- onReceivedTitle()不被调用问题解决
- WebView 返回键 onReceivedTitle 不触发 问题解决
- onReceivedTitle() 没被调用的解决
- IOS懒加载不调用问题解决方案
- IOS懒加载不调用问题解决方案
- dllmain不被调用
- onActivityResult()不被调用
- 调用系统照相机Activity被销毁问题解决
- cocos2d ccTouchBegan不被调用
- cocos2d ccTouchBegan不被调用
- 解决onConfigurationChanged不被调用
- extjs使用AJAX调用方法结束不给返回值赋值问题解决
- eclipse不可用问题解决
- div不换行问题解决
- CUDA函数库调用问题解决
- openwrt uboot_envtools调用问题解决
- CUDA函数库调用问题解决
- 问题解决:这个回应response的getOutputStream()已经被调用过
- 关于Q复制
- 使用onNewIntent实现startActivityForResult的返回传值
- 链式队列
- 播放声音
- 频谱仪 直流耦合
- onReceivedTitle()不被调用问题解决
- T-SQL sqlServer 创建视图
- mysql 中key , primary key ,unique key 与index的区别
- 欢迎使用CSDN-markdown编辑器
- 【iOS】让我们一次性解决导航栏的所有问题
- RuntimeException:~ InflateException
- hadoop下的Map-Reduce最高温度例子
- 下拉框选择
- Java线程