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>

Documentation Link

我用 Ti.UI.Picker 代替 date/times。在这种情况下,您需要设置 value 属性 来告诉选择器选择了什么值。我想您需要与其他类型的选择器相同,例如:

picker = Titanium.UI.createPicker({
        width : "75%",
        height : "50dip",
        selectionIndicator : true,
        value : '0'
    });

/约翰