cocos2dx之WebView踩过的坑(android返回键处理问题)
2017-07-25 11:04
3451 查看
最近游戏接入了一个私服平台,由于没有sdk,所以支付相关的操作需要在网页端进行,也就是说点击充值需要在游戏内部弹出一个网页,并定位到平台充值的地址。查阅相关资料后决定使用cocos2dx自带的WebView来完成这项任务。WebView的使用方式非常简单,代码如下:
是不是很简单?但是在测试的时候却出现了问题。弹出网页之后,如果点击返回键游戏就会退出,分析之后发现是View处理返回键的默认操作是销毁当前Activity。理想的效果是在弹出WebView之后,如果点击返回键,先判断网页是否可返回,如果可返回就退到上一级网页,如果不可返回(在最初的网页),就关闭WebView,返回游戏。
首先监听游戏内部返回键,并处理返回键逻辑:
接下来让WebView弹出来时点击返回键也执行上述逻辑,这要修改WebView源代码,打开Cocos2dxWebView.java,路径为:src/org/cocos2dx/lib/Cocos2dxWebView.java
其中Cocos2dxGLSurfaceView就是游戏界面的View,当WebView的返回键事件触发时,直接调用游戏主界面的事件监听函数,并禁止事件向下传递。
#include "ui/CocosGUI.h" using namespace cocos2d::experimental::ui; m_WebView = WebView::create(); // m_WebView为成员变量 m_WebView->setPosition(visibleSize / 2);
m_WebView->setContentSize(visibleSize); m_WebView->loadURL("http://www.baidu.com"); m_WebView->setScalesPageToFit(true); m_WebView->setOnShouldStartLoading([](WebView *sender, const std::string&url) { return true; }); m_WebView->setOnDidFinishLoading([](WebView *sender, const std::string&url) { }); m_WebView->setOnDidFailLoading([](WebView *sender, const std::string&url) { }); this->addChild(m_WebView);
是不是很简单?但是在测试的时候却出现了问题。弹出网页之后,如果点击返回键游戏就会退出,分析之后发现是View处理返回键的默认操作是销毁当前Activity。理想的效果是在弹出WebView之后,如果点击返回键,先判断网页是否可返回,如果可返回就退到上一级网页,如果不可返回(在最初的网页),就关闭WebView,返回游戏。
首先监听游戏内部返回键,并处理返回键逻辑:
bool FirstScene::init() { //注册捕捉监听 auto listenerkeyPad = EventListenerKeyboard::create(); listenerkeyPad->onKeyReleased = CC_CALLBACK_2(FirstScene::onKeyReleased, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listenerkeyPad, this); } void FirstScene::onKeyReleased(EventKeyboard::KeyCode keycode, cocos2d::Event *event) { if (keycode == EventKeyboard::KeyCode::KEY_BACKSPACE) { if (m_WebView) // 如果WebView正在显示 { if (m_WebView->canGoBack()) // 判断是否可返回到上一级网页 { m_WebView->goBack(); } else { m_WebView->runAction(RemoveSelf::create()); // 关闭WebView m_WebView = nullptr; } } else // 如果处于游戏主界面 { Director::getInstance()->popScene(); // 结束游戏 } } }
接下来让WebView弹出来时点击返回键也执行上述逻辑,这要修改WebView源代码,打开Cocos2dxWebView.java,路径为:src/org/cocos2dx/lib/Cocos2dxWebView.java
public Cocos2dxWebView(Context context, int viewTag) { super(context); this.mViewTag = viewTag; this.mJSScheme = ""; this.setFocusable(true); this.setFocusableInTouchMode(true); this.getSettings().setSupportZoom(false); this.getSettings().setDomStorageEnabled(true); this.getSettings().setJavaScriptEnabled(true); // `searchBoxJavaBridge_` has big security risk. http://jvn.jp/en/jp/JVN53768697 try { Method method = this.getClass().getMethod("removeJavascriptInterface", new Class[]{String.class}); method.invoke(this, "searchBoxJavaBridge_"); } catch (Exception e) { Log.d(TAG, "This API level do not support `removeJavascriptInterface`"); } this.setWebViewClient(new Cocos2dxWebViewClient()); this.setWebChromeClient(new WebChromeClient()); this.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) // 返回键 { Cocos2dxGLSurfaceView.getInstance().onKeyDown(keyCode, KeyEvent) // 调用游戏主界面的事件监听函数 return true; // 拦截事件,禁止事件向下传递 } return false; // 其他事件不做处理,继续传递 } }); }
其中Cocos2dxGLSurfaceView就是游戏界面的View,当WebView的返回键事件触发时,直接调用游戏主界面的事件监听函数,并禁止事件向下传递。
相关文章推荐
- Android学习之实现WebView中input="file"选择文件,处理选择图片无法返回类型问题
- Android WebView无法返回上一页的问题。
- Android webview处理404、500、断网、timeout页面的问题(by 星空武哥)
- android webview 如何去广告和如何解决重定向返回的问题。
- android webview重定向 返回按钮死循环问题修改
- android webview: 视频全屏播放按返回页面被放大的问题
- Android中WebView加载Url时出现域名连接重定向时返回控制死循环的问题
- webview 笔记二(android和js交互、包括链接跳转常见问题处理,加载监视,拦截Url等)
- Android WebView Touch事件及相关问题处理
- android webview 如何去广告和如何解决重定向返回的问题。
- Android H5微信支付 webview设置referer 请求头无效问题解释和详细处理方案
- Android 安卓WebView套壳H5网页 手机返回键问题(过滤二级页面,返回键相应给WebView)
- Android WebView常见问题处理
- Android WebView页面结束后视频播放还有声音问题处理
- Android中Fragment装载WebView 返回键设置问题
- android——处理Google play因WebView SSL Error Handler alerts被拒的问题
- android——webview拦截跳转指定url后,点击返回界面重定向的问题
- android webview中加入无线淘宝客页面点击宝贝详情链接进入宝贝详情页面后无法返回问题
- 关于Android原生集成5+webview,监听webview返回时,执行两次onkey方法问题的解决
- android Webview中注入js,用于解决第三方页中出现返回事件window.history.go(-1),无法响应问题