Event Propogation problem in G2

This code demonstrates a problem with eventing that is problematic. Is this a bug?

I click a widget.button, in the onRelease handler I create an ImageRect and I attach a new listener. That listener gets the event. Why would a new listener get a tap event when handling that event? How do you stop a button from sending a new tap event out onRelease?

local scene = storyboard.newScene() local startButton local scrollView local scrollViewGroup local scrollViewItems = {} local overGroup local overButton local overChildButton local \_Nfo = require("mail") local \_Sheet = graphics.newImageSheet( "mail.png", \_Nfo:getSheet() ) function scene:createScene( event ) local group = self.view local background = display.newRect(0,0,768,1152) background.x = 768/2 background.y = 1152/2 background:setFillColor(0,142/255,0,1) group:insert(background) local scrollView = widget.newScrollView { top = 700, left = 32, width = 672, height = 320, horizontalScrollDisabled = true, hideScrollbar = true, verticalScrollDisabled = false, hideBackground = false, backgroundColor = { 123/255, 1, 1, 1 }, maskFile = "scrollmask.png", } group:insert(scrollView) scrollViewGroup = display.newGroup() scrollView:insert(scrollViewGroup) scene:addScrollViewButtons() startButton = widget.newButton{ left = 200, top = 400, sheet = \_Sheet, defaultFrame = \_Nfo:getFrameIndex("Compose-btn"), overFrame = \_Nfo:getFrameIndex("Compose-pbtn"), onPress = function(e) end, onRelease = function(e) scene:createOverlay2() return true end } group:insert(startButton) end function scene:enterScene( event ) end function scene:destroyScene( event ) scene:removeEventListener( "createScene", scene ) scene:removeEventListener( "enterScene", scene ) scene:removeEventListener( "destroyScene", scene ) end scene:addEventListener( "createScene", scene ) scene:addEventListener( "enterScene", scene ) scene:addEventListener( "destroyScene", scene ) ----------------------------------------------------------------------------------------- function scene:addScrollViewButtons() local pLeft = 60 local pTop = 50 for i=1,5 do pTop = i\*110 scrollViewItems[i] = display.newGroup() local scrollItemRect = display.newRect(0,0,100,100) scrollItemRect:setFillColor(111/255,222/255,84/255,1) scrollItemRect.x = pLeft scrollItemRect.y = pTop scrollViewItems[i]:insert(scrollItemRect) scrollViewItems[i]:addEventListener("tap",scene) scrollViewItems[i]:addEventListener("touch",scene) scrollViewGroup:insert(scrollViewItems[i]) end end function scene:tap(e) print("grid item tapped") end function scene:touch(e) print("grid item touched") end function scene:createOverlay2() local group = self.view print("createOverlay2") overGroup = display.newGroup() group:insert(overGroup) overGroup:addEventListener("tap",function() print("group tap2") return true end) overGroup:addEventListener("touch",function() print("group touch2") return true end) overButton = display.newImageRect(overGroup, \_Sheet, \_Nfo:getFrameIndex("Mail-bg"), 768, 1152) overButton.x = 768/2 overButton.y = 1152/2 overButton:addEventListener("tap",function() print("overButton tap2") overGroup:removeSelf() overGroup = nil return true end) overButton:addEventListener("touch",function() print("overButton touch2") return true end) overChildButton = widget.newButton{ left = 32, top = 750, sheet = \_Sheet, defaultFrame = \_Nfo:getFrameIndex("PageLeft-btn"), overFrame = \_Nfo:getFrameIndex("PageLeft-pbtn"), onRelease = function(e) print("close release2") overGroup:removeSelf() overGroup = nil return true end, onPress = function(e) print("close press2") return true end } overGroup:insert(overChildButton) --[[overChildButton:addEventListener("tap",function() print("tap el2") overGroup:removeSelf() overGroup = nil return true end)]]-- --[[overChildButton:addEventListener("touch",function() print("touch el2") return true end)]]-- end return scene

In G1 you create overlays as buttons which can contain child elements and set the button to enabledfalse and events stop falling through.

If this is not a bug, how are you supposed to create overlays that can be cleared onTap? Use a scene flag as a lock for every possible overlay state combination?

It sounds like you’re experiencing what’s mentioned under ‘Gotchas’ here:

http://docs.coronalabs.com/api/type/EventListener/addEventListener.html

These are different objects I’m dealing with. Adding an event listener for objectB in the event listener of an objectA shouldn’t send the event to the objectB. The event should have expired in that frame and not have been sent to objectB at all. objectB wasn’t even instantiated yet.

Well, I ran your code and when I replaced

scene:createOverlay2()

in your button’s onRelease with 

timer.performWithDelay(1, function() scene:createOverlay2() end)

it works as expected. So it still looks like you’re running in to the ‘Gothca’

It sounds like you’re experiencing what’s mentioned under ‘Gotchas’ here:

http://docs.coronalabs.com/api/type/EventListener/addEventListener.html

These are different objects I’m dealing with. Adding an event listener for objectB in the event listener of an objectA shouldn’t send the event to the objectB. The event should have expired in that frame and not have been sent to objectB at all. objectB wasn’t even instantiated yet.

Well, I ran your code and when I replaced

scene:createOverlay2()

in your button’s onRelease with 

timer.performWithDelay(1, function() scene:createOverlay2() end)

it works as expected. So it still looks like you’re running in to the ‘Gothca’