Appcelerator - Android 选择器不保留所选值
Appcelerator - Android Picker not retaining selected value
考虑以下代码:
function doClick(e) {
win.open();
}
var picker = null;
var backBtn = null;
var selectedIdx = 0;
$.index.open();
var win = Titanium.UI.createWindow({
exitOnClose : false,
navBarHidden : true
});
win.addEventListener("open", function() {
if(null != picker) {
//picker.setSelectedRow(0, selectedIdx, false);
return;
}
picker = Titanium.UI.createPicker({
width : "75%",
height : "50dip",
selectionIndicator : true
});
picker.addEventListener("change", function(id) {
selectedIdx = id.rowIndex;
});
var arr = [];
for(var i = 0; i < 10; i++) {
arr.push(Titanium.UI.createPickerRow({
title : i,
color : "black"
}));
}
selectedIdx = 0;
picker.add(arr);
backBtn = Titanium.UI.createButton({
bottom : "10dip",
title : "Close"
});
backBtn.addEventListener("click", function() {
win.close();
});
win.add(picker);
win.add(backBtn);
});
如果使用 SDK 5.2.0.GA 或 5.2.2.GA 执行上述代码,您将看到选择器值未被保留。在 window 的 open/close 之后,即使我们重用旧的选择器对象。但是,如果您取消注释 setSelectedRow(我会说黑客代码),那么它会按要求运行。
任何人都遇到过此类问题或知道适当的解决方案或根本原因。
我认为这是预期的行为。选择器附加到 window 和 Android 从版本 3.2.0 开始,所有 windows 都是重量级的。重量级 window 与新 Android Activity 相关联。因此,当 window 关闭时,activity 也会关闭,选择器也会关闭。在这种情况下,选择器不应该保留其选择的值。在这种情况下,您可以尝试使用轻量级window。
在 Android 中发布 Titanium 3.2.0 之前,Titanium windows 可以是重量级的也可以是轻量级的:
重量级 window 与新的 Android Activity 关联。
轻量级 window 是全屏视图,并在当前 Android Activity.
中运行
如果您仍然想要旧的行为,可以在 tiapp.xml:
中启用 ti.android.useLegacyWindow 属性
<property name="ti.android.useLegacyWindow" type="bool">true</property>
我用 Ti.UI.Picker
代替 date/times。在这种情况下,您需要设置 value
属性 来告诉选择器选择了什么值。我想您需要与其他类型的选择器相同,例如:
picker = Titanium.UI.createPicker({
width : "75%",
height : "50dip",
selectionIndicator : true,
value : '0'
});
/约翰
考虑以下代码:
function doClick(e) {
win.open();
}
var picker = null;
var backBtn = null;
var selectedIdx = 0;
$.index.open();
var win = Titanium.UI.createWindow({
exitOnClose : false,
navBarHidden : true
});
win.addEventListener("open", function() {
if(null != picker) {
//picker.setSelectedRow(0, selectedIdx, false);
return;
}
picker = Titanium.UI.createPicker({
width : "75%",
height : "50dip",
selectionIndicator : true
});
picker.addEventListener("change", function(id) {
selectedIdx = id.rowIndex;
});
var arr = [];
for(var i = 0; i < 10; i++) {
arr.push(Titanium.UI.createPickerRow({
title : i,
color : "black"
}));
}
selectedIdx = 0;
picker.add(arr);
backBtn = Titanium.UI.createButton({
bottom : "10dip",
title : "Close"
});
backBtn.addEventListener("click", function() {
win.close();
});
win.add(picker);
win.add(backBtn);
});
如果使用 SDK 5.2.0.GA 或 5.2.2.GA 执行上述代码,您将看到选择器值未被保留。在 window 的 open/close 之后,即使我们重用旧的选择器对象。但是,如果您取消注释 setSelectedRow(我会说黑客代码),那么它会按要求运行。
任何人都遇到过此类问题或知道适当的解决方案或根本原因。
我认为这是预期的行为。选择器附加到 window 和 Android 从版本 3.2.0 开始,所有 windows 都是重量级的。重量级 window 与新 Android Activity 相关联。因此,当 window 关闭时,activity 也会关闭,选择器也会关闭。在这种情况下,选择器不应该保留其选择的值。在这种情况下,您可以尝试使用轻量级window。
在 Android 中发布 Titanium 3.2.0 之前,Titanium windows 可以是重量级的也可以是轻量级的:
重量级 window 与新的 Android Activity 关联。
轻量级 window 是全屏视图,并在当前 Android Activity.
中运行
如果您仍然想要旧的行为,可以在 tiapp.xml:
中启用 ti.android.useLegacyWindow 属性<property name="ti.android.useLegacyWindow" type="bool">true</property>
我用 Ti.UI.Picker
代替 date/times。在这种情况下,您需要设置 value
属性 来告诉选择器选择了什么值。我想您需要与其他类型的选择器相同,例如:
picker = Titanium.UI.createPicker({
width : "75%",
height : "50dip",
selectionIndicator : true,
value : '0'
});
/约翰