{ "id": "85679", "key": "AC-2789", "fields": { "issuetype": { "id": "1", "description": "A problem which impairs or prevents the functions of the product.", "name": "Bug", "subtask": false }, "project": { "id": "12217", "key": "AC", "name": "Appcelerator - INBOX", "projectCategory": { "id": "10000", "description": "", "name": "Customer Service" } }, "resolution": { "id": "3", "description": "The problem is a duplicate of an existing issue.", "name": "Duplicate" }, "resolutiondate": "2012-01-30T03:56:22.000+0000", "created": "2012-01-30T03:10:10.000+0000", "labels": [], "versions": [], "issuelinks": [], "assignee": { "name": "mpmiranda", "key": "mpmiranda", "displayName": "Mauro Parra-Miranda", "active": true, "timeZone": "America/Mexico_City" }, "updated": "2016-03-08T07:47:42.000+0000", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "components": [ { "id": "14548", "name": "Titanium SDK & CLI", "description": "Please enter tickets related to the MobileSDK here." } ], "description": "h2. Problem\r\n\r\nThe problem is that selecting picker's row programmatically (by calling its \"setSelectedRow\" method) is not reflected immediately and reading selected row's value (by calling its \"getSelectedRow\" method) does not work, unless window is opened. Also, \"change\" event in that case is not fired.\r\n\r\nh2. Test case\r\n\r\n{code:lang=javascript|title=app.js}\r\nvar win = Ti.UI.createWindow({\r\n\tnavBarHidden: true\r\n});\r\n\r\nvar picker = Ti.UI.createPicker();\r\n\r\nvar data = [];\r\ndata[0] = Ti.UI.createPickerRow({ title:'Bananas' });\r\ndata[1] = Ti.UI.createPickerRow({ title:'Strawberries' });\r\ndata[2] = Ti.UI.createPickerRow({ title:'Mangos' });\r\ndata[3] = Ti.UI.createPickerRow({ title:'Grapes' });\r\npicker.add(data);\r\n\r\npicker.addEventListener('change', function(e) {\r\n\tTi.API.error('Picker change ' + e.row.title);\r\n});\r\n\r\nwin.add(picker);\r\n\r\npicker.setSelectedRow(0, 2);\r\nvar selectedRow = picker.getSelectedRow(0) || {};\r\nTi.API.info('Picker selected row ' + selectedRow.title);\r\n\r\nwin.addEventListener('open', function() {\r\n\t\r\n\tTi.API.info('Picker selected row WINDOW OPEN 1 ' + picker.getSelectedRow(0).title);\r\n\t\r\n\tpicker.setSelectedRow(0, 1);\r\n\t\r\n\tTi.API.info('Picker selected row WINDOW OPEN 2 ' + picker.getSelectedRow(0).title);\r\n});\r\n\r\nwin.open();\r\n{code}\r\n\r\nh2. Logs\r\n\r\n{code:lang=none|title=console}\r\n01-30 11:56:36.410: I/TiAPI(3576): Picker selected row undefined\r\n01-30 11:56:36.640: I/TiAPI(3576): Picker selected row WINDOW OPEN 1 Mangos\r\n01-30 11:56:36.690: I/TiAPI(3576): Picker selected row WINDOW OPEN 2 Strawberries\r\n01-30 11:56:36.690: E/TiAPI(3576): Picker change Strawberries\r\n{code}\r\n\r\nh2. Expected behavior\r\n\r\nPicker's \"setSelectedRow\" and \"getSelectedRow\" method calls outside window's \"open\" event handler should work in same manner as in window's \"open\" event handler.", "attachment": [], "flagged": false, "summary": "Android: Picker does not work properly before window opens", "creator": { "name": "ivan.skugor", "key": "ivan.skugor", "displayName": "Ivan Skugor", "active": true, "timeZone": "Europe/Amsterdam" }, "subtasks": [], "reporter": { "name": "ivan.skugor", "key": "ivan.skugor", "displayName": "Ivan Skugor", "active": true, "timeZone": "Europe/Amsterdam" }, "environment": "* Titanium SDK version: 1.8.1 (01/27/12 17:31 a24502a), v8\r\n* Android 3.1\r\n* Thinkpad tablet\r\n* Windows XP", "comment": { "comments": [ { "id": "181029", "author": { "name": "pdowsett", "key": "pdowsett", "displayName": "Paul Dowsett", "active": true, "timeZone": "Europe/London" }, "body": "Thanks for raising this, Ivan.\r\n\r\nThis is expected behavior that is being addressed in the apidocs, via ticket TIMOB-7050.\r\n\r\nThe fact that it does not work inside of an open eventlistener is related to TIMOB-5303. Let's see the outcome of that ticket before raising more, potentially duplicate, tickets.\r\n\r\nHence, closing this for now.", "updateAuthor": { "name": "pdowsett", "key": "pdowsett", "displayName": "Paul Dowsett", "active": true, "timeZone": "Europe/London" }, "created": "2012-01-30T03:54:45.000+0000", "updated": "2012-01-30T03:54:45.000+0000" }, { "id": "181030", "author": { "name": "pdowsett", "key": "pdowsett", "displayName": "Paul Dowsett", "active": true, "timeZone": "Europe/London" }, "body": "btw, if you can prove that settimeout cannot be used to resolve the open in eventlistener issue, then please report back.\r\n\r\nThanks", "updateAuthor": { "name": "pdowsett", "key": "pdowsett", "displayName": "Paul Dowsett", "active": true, "timeZone": "Europe/London" }, "created": "2012-01-30T03:55:47.000+0000", "updated": "2012-01-30T03:55:47.000+0000" }, { "id": "181031", "author": { "name": "ivan.skugor", "key": "ivan.skugor", "displayName": "Ivan Skugor", "active": true, "timeZone": "Europe/Amsterdam" }, "body": "\"setTimeout\" cannot be used because there is no way to know how much time will take opening of the window (\"open\" event must be used in my opinion).You can pick some value for time in \"setTimeout\", but that doesn't guarantee it will work in any situation.\r\n\r\n\r\n\r\nBtw, in Picker API docs:\r\n\r\nwin.add(picker);\r\nwin.open();\r\n \r\n// must be after picker has been displayed\r\npicker.setSelectedRow(0, 2, false); // select Mangos\r\n\r\n\r\n\r\nThat works if it's used before \"win.open()\" and if you try to use \"getSelectedRow\", you'll get \"null\".", "updateAuthor": { "name": "ivan.skugor", "key": "ivan.skugor", "displayName": "Ivan Skugor", "active": true, "timeZone": "Europe/Amsterdam" }, "created": "2012-01-30T04:58:50.000+0000", "updated": "2012-01-30T04:58:50.000+0000" }, { "id": "181187", "author": { "name": "ivan.skugor", "key": "ivan.skugor", "displayName": "Ivan Skugor", "active": true, "timeZone": "Europe/Amsterdam" }, "body": "Switch component also has similar (event not fired before window is opened) issue:\r\n\r\n{code}\r\nvar win = Ti.UI.createWindow({\r\n\tnavBarHidden: true\r\n});\r\n\r\nvar toogle = Ti.UI.createSwitch();\r\n\r\ntoogle.addEventListener('change', function(e) {\r\n\tTi.API.info('Change event ...');\r\n\tTi.API.debug(JSON.stringify(e));\r\n});\r\n\r\nwin.add(toogle);\r\n\r\ntoogle.value = true;\r\n\r\nwin.addEventListener('open', function() {\r\n\t\r\n\ttoogle.value = false;\r\n\t\r\n});\r\n\r\nwin.open();\r\n{code}\r\n\r\nIf you run this example, you'll see that \"change\" event is fired only once, while value is changed twice.\r\n\r\nI think the problem is that UI components are not created immediately (when they are created via factory methods in JS code) and therefore some of their functionality is missing/not working before they actually are created (which is when windows opens, for sure).", "updateAuthor": { "name": "ivan.skugor", "key": "ivan.skugor", "displayName": "Ivan Skugor", "active": true, "timeZone": "Europe/Amsterdam" }, "created": "2012-01-31T06:39:23.000+0000", "updated": "2012-01-31T06:39:23.000+0000" }, { "id": "281061", "author": { "name": "mpmiranda", "key": "mpmiranda", "displayName": "Mauro Parra-Miranda", "active": true, "timeZone": "America/Mexico_City" }, "body": "DUP issue. ", "updateAuthor": { "name": "mpmiranda", "key": "mpmiranda", "displayName": "Mauro Parra-Miranda", "active": true, "timeZone": "America/Mexico_City" }, "created": "2013-11-24T22:30:14.000+0000", "updated": "2013-11-24T22:30:14.000+0000" } ], "maxResults": 5, "total": 5, "startAt": 0 } } }