应用Hello MUI中预加载一个模板父页面和共用子页面的方案(http://ask.dcloud.net.cn/article/106),实现无等待窗体切换功能。遇到两个问题求助各路英雄好汉!
1.多级子页面公用一个WebView时,如何逐级返回
在A页面选择列表中的一项,打开公用的WebView,通过loadurl的方式加载B页面,在B页面点击按钮后再通过这个公用WebView加载C页面,那么问题来了,在C页面点击返回,直接隐藏了公用的WebView,显示了列表A页面,这里如何实现逐级返回呢,我试了下借助WebViewObject的back,但是不太完美,看看大伙儿的方案或者官方大大的方案。
2.如1中场景,A页面中定义了连续两次返回即退出的功能,但是,在B页面或者C页面,点击Android手机的返回键,居然调用了A页面的mui.bak=function(){...},提示再点一次退出应用程序,正常情况下在B或者C页面应该是执行公用WebView模板父页面中定义的返回...找了很久没找到原因。
12 个回复
太阳神
核心问题是头部点击返回动作和手机back健的返回动作不一致,怎么会这样的啊
Danny (作者) - QQ125904483
上代码,求解放
Danny (作者) - QQ125904483
大哥们,快出来呀
Danny (作者) - QQ125904483
为啥Android物理按键执行的不是当前显示的WebView的事件呢?这是为啥?
DCloud_UNI_CHB
首先,模板方案有其适用场景:同级页面,不存在返回需求的情况;
例如:从A页面既可以打开B页面、又可以打开C页面,则B、C可共用模板页面;
但你的场景下,A->B->C,此种情况下,不建议适用模板方案;因为该模式下,返回效果并不理想,即使适用webview.back,也会有白屏出现;
back按键的问题,应该是5+ runtime的bug,该team正在确认;
Android_磊子
此问题确认为bug,静待更新。
Danny (作者)
感谢磊哥,磊哥V5
2015-05-20 20:27
太阳神
更新了吗?我升级过后还会出现这种情况啊。
a->b->c
按c的页面头部的返回没问题,但是按android的返回健就出现把b给关了
Android_磊子
已经更新了。
2015-06-02 12:11
太阳神
回复 Android_磊子:我就是用最新版本的啊,是今天更新了的吗?
2015-06-02 12:30
太阳神
回复 Android_磊子:请看一下下面的评论,我发现的问题和楼主的可能并不完全一样
2015-06-02 12:31
太阳神
B是直接open出来的,不是在a预加载的
太阳神
求解决啊,不然就要停工了,预加载的话就没问题,但不可能所有很少用到的页面都要预加载吧
Danny (作者)
1.7版好像解决了呢,你试试http://ask.dcloud.net.cn/question/5883
2015-06-01 11:32
太阳神
我去看看
2015-06-01 11:36
太阳神
看了一下这个帖子,没解决问题嘛,还是要求预加载
2015-06-01 11:43
太阳神
而且像a-b-c这种模式的业务,如果出现第4个页面,因为不能和a和b共享母版,除非和c的母版结构完全一样,不然又要预加载一套
比如我就遇到一个情况,d页面是搜索结果列表页面,d不可能和c(详细页)共享母版,因为d的列表项点开来是c啊
2015-06-01 11:54
DCloud_UNI_CHB
你的代码和楼主的一样吗?直接运行楼主上传的代码能重现问题不?
2015-06-01 12:19
太阳神
回复 DCloud_UNI_CHB:您下载一下 http://xuep.in/app.apk 试一下就知道了
测试的时候,在首页搜索框中填写"衬衫",出现的搜索结果列表页中随便点开一个商品,这个时候按android的返回键,就会发现问题。
列表页我没有重写mui.back,就只是使用默认的行为
2015-06-01 17:07
太阳神
回复 DCloud_UNI_CHB:首页是这样打开结果列表页的:
mui.openWindow({
url: 'search-container.html',
id: 'search-container'
});
search-container.html 中相关代码是:(没有重写mui.back)
mui.init({
gestureConfig: { doubletap: true },
subpages: [{
id: 'search-content',
url: 'search.html',
styles: { top: '90px', bottom: 0 }
}]
});
商品详细页没有相关代码,也没有重写mui.back
2015-06-01 17:13
太阳神
回复 DCloud_UNI_CHB:
search.html 中点开商品详情的关联代码:
详情页使用了预加载
2015-06-01 17:15
太阳神
会不会是 预加载的webview ----点开----> openWindow的webview ----点开---->预加载的webview,然后返回就会出问题?
2015-06-01 21:46
太阳神
@DCloud_Android_磊子:
@DCloud_MUI_CHB:
预加载的webview --------点开(使用openWindow)----> 非预加载的webview -------点开------>预加载的webview,然后android实体按键返回就会出问题
必定会出问题,我试过好几部不同品牌不同型号不同android版本的手机,都有这个情况
太阳神
绝对不是我代码的问题,因为页面头部的返回是正常的
Android_磊子
mui.openWindow会重新创建窗口的,返回键处理逻辑是最近执行plus.key.addEventListener执行。不知道你注意这地方没有。
太阳神
我没有定义 plus.key.addEventListener ,都是用你们的默认返回行为,或者最多有的页面重新定义mui.back,你的意思是每个页面 都要 定义 plus.key.addEventListener 来针对实体键的返回?
2015-06-02 13:02
太阳神
就算定义mui.back,也是参照官方例子里面要求的隐去子窗口
mui.back = function() {
var current = plus.webview.currentWebview();
current.hide('auto');
setTimeout(function() {
if (content_webview == null) content_webview = current.children()[0];
content_webview.hide('none');
}, 200);
};
2015-06-02 13:13
太阳神
不知道你明白了没有,就是同一个页面 实体键的返回 和 mui-action-back 的返回行为不一致,而且明显实体键现在这样是错误的
2015-06-02 13:15
太阳神
a -b-c 三级如果都是 预加载的 那肯定没问题
但问题是:
如果 b是a页面通过 mui.openWindow的方法打开的新窗口,
c是b打开的,但是c是预加载的,这个时候就出现问题了
2015-06-02 13:19
太阳神
我还没有试过,如果c 是b页面通过 mui.openWindow的方法打开的情况会不会出问题
2015-06-02 13:21
DCloud_UNI_FXY
回复 太阳神:直接发一个测试工程
2015-06-02 13:37
太阳神
回复 DCloud_UNI_FXY: 已经给你私信,发了整个项目的源代码
2015-06-02 13:51