用java退出确认框,会连续弹出两次确认框,求解答

单击手机返回键,会连续弹出两次确认框!!!

Lua代码

 

self:performWithDelay(function() 
-- keypad layer, for android 
local layer = display.newLayer() 
layer:addKeypadEventListener(function(event) 
print("addKeypadEventListener:", event) 
if event == "back" then 
print("begin addKeypadEventListener back ", event) 
-- call Java method 
local javaClassName = "com.yishanghe.game.ball.Ball" 
local javaMethodName = "showAlertDialog" 
local javaParams = { 
"确认退出", 
"您确定要退出游戏吗?", 
function(eventParam) 
printf("Java method callback value is %s]", eventParam) 
if eventParam == "OK" then 
app:exit() 
end 
end 
} 
local javaMethodSig = "(Ljava/lang/String;Ljava/lang/String;I)V" 
luaj.callStaticMethod(javaClassName, javaMethodName, javaParams, javaMethodSig) 

end 
if event == "menu" then 
--do something 
end 
end) 
self:addChild(layer) 

layer:setKeypadEnabled(true) 
end, 0.2) 


```
 

java代码 
 
static public void showAlertDialog(final String title, 
final String message, final int luaCallbackFunction) { 
s_instance.runOnUiThread(new Runnable() { 
@Override 
public void run() { 
AlertDialog alertDialog = new AlertDialog.Builder(s_instance).create(); 
alertDialog.setTitle(title); 
alertDialog.setMessage(message); 
alertDialog.setButton("确定", new DialogInterface.OnClickListener() { 
@Override 
public void onClick(DialogInterface dialog, int which) { 
s_instance.runOnGLThread(new Runnable() { 
@Override 
public void run() { 
Cocos2dxLuaJavaBridge.callLuaFunctionWithString(luaCallbackFunction, "OK"); 
Cocos2dxLuaJavaBridge.releaseLuaFunction(luaCallbackFunction); 
} 
}); 
} 
}); 
alertDialog.setButton2("取消", new DialogInterface.OnClickListener() { 
@Override 
public void onClick(DialogInterface dialog, int which) { 
s_instance.runOnGLThread(new Runnable() { 
@Override 
public void run() { 
Cocos2dxLuaJavaBridge.callLuaFunctionWithString(luaCallbackFunction, "CANCEL"); 
Cocos2dxLuaJavaBridge.releaseLuaFunction(luaCallbackFunction); 
} 
}); 
} 
}); 

alertDialog.setIcon(R.drawable.icon); 
alertDialog.show(); 
} 
}); 


```

你是哪个版本?

有没有日志?

有日志,,,就是执行了两次

从LOG上看,是back键的消息传过来了两次,你的Listener被调用了两次

我换了台机器就正常了。。。不知道是否是兼容问题
中兴795会弹出两次 小米2S正常一次 ,,,其他机型 待一一测试

这样的情况可以加锁来保护下。

为什么要用这种方式退出呢。调用android系统的对话框,不如在lua 层自定义。也可以和游戏的UI素材保持一致

cocos 的 event 监听器会在一个事件的不同阶段每次都做触发,目测你的问题是在 keydown, keyup 被触发了两次(目测的,不保证正确)

解决的办法是判断一下cocos触发时候传入的 eventType 类型,参考 http://yi.github.io/work/2014/07/23/Cocos2dx-ccui-组件的Touch事件处理/