cocos2dx之WebView踩过的坑(android返回键处理问题)

  最近游戏接入了一个私服平台,由于没有sdk,所以支付相关的操作需要在网页端进行,也就是说点击充值需要在游戏内部弹出一个网页,并定位到平台充值的地址。查阅相关资料后决定使用cocos2dx自带的WebView来完成这项任务。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的返回键事件触发时,直接调用游戏主界面的事件监听函数,并禁止事件向下传递。

时间: 2024-08-04 17:12:44

cocos2dx之WebView踩过的坑(android返回键处理问题)的相关文章

Cocos2d-x响应android返回键

开启按键按键监听 setKeypadEnabled(true); 重写监听事件函数 virtual void keyBackClicked(); 如: void BanQiuLayer::keyBackClicked() { //暂停声音播放 CocosDenshion::SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); mag->toBeginLayer(); //返回到上一个场景 } Cocos2d-x响应android返

ionic框架对Android返回键的处理

在HybridApp移动跨平台开发中,android平台会遇到一些比较特殊并难以解决的问题,这些问题在原生应用开发中很easy, Android的返回键处理就是问题之一,假如我们要实现一个在很多App中都有的在主页按返回键弹出对话框提示用户退出应用的功能,在原生应用开发中是很容易的,只要在onKeyUp事件里面对返回键事件进行处理就可以了.按2次返回键退出应用的Java代码如下: private long exitTime = 0; @Override public boolean onKeyD

quick-cocos2d-x android返回键监听并实现原生退出对话框

这两天终于闲了一下,就顺手又把quick捡起来又学了学,一直都觉得quick比cocos2dx那套lua绑定要方便许多,今天试了下android返回键的监听,还是挺好弄的,所以就有了这篇. 首先说明一下使用的quick版本--2.2.5. 直接上代码 function MainScene:addBackEvent() if device.platform == "android" then self.touchLayer = display.newLayer() self.touchL

Android 返回键双击退出程序

/** * 菜单.返回键响应 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { exitBy2Click();// 调用双击退出函数 } return false; } private long exitTime = 0; /** * 双击退出:利用计算时间差实现 */ public void exitBy2Click() { i

android 返回键两次退出

返回键两次退出 private long exitTime = 0; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){ if((System.currentTimeMillis()-exitTime) > 2000){ Toast.make

Coco2d-js/Cocos2d-html5中Android返回键实现

导语: 首先Cocos2d-x其中实现Menu和Back按键相对简单一点,而在资源较少的Cocos2d-html5其中.要实现返回还是有一点不一样的,并且有没有详细的demo.也就仅仅有自己去看api文档.这也是头痛的一件事情,下面总结和归纳在Cocos2d-html5其中.怎样实现返回键.和Menu键. 分析: cocos2d中眼下仅仅有Layer以及其子类可以获取用户输入.即触发用户输入的事件. 这个结论是我通过查看API文档推測的,由于要触发这些事件.必需要有setIsKeypadEnab

关于 android 返回键 代码实现

转自:http://www.dewen.io/q/11313/android+%E6%A8%A1%E6%8B%9F%E8%BF%94%E5%9B%9E%E9%94%AE%E5%8A%9F%E8%83%BD, 我测试发现,有两种方法可行.①.java.lang.Runtime Runtime runtime = Runtime.getRuntime(); runtime.exec("input keyevent " + KeyEvent.KEYCODE_BACK); ②.android.

Android监视返回键

android在发展中,监视键返回到后事件经常被用来,在下面的例子来说明什么android返回键事件监听器. public class BackKeyTest extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCo

H5监听Android物理返回键

问题:H5页面的返回键可以回退到指定页面,但是Android手机的物理返回键会回到上一页. 解决办法:以下代码可以实现,Android返回键时调用H5的方法(下面代码中用的是H5的GoBackUrl方法),实现跳转到指定页面. //拦截安卓回退按钮,调用H5的返回方法 history.pushState(null, null, location.href); window.addEventListener('popstate', function (event) { history.pushSt