1

我正在学习煎茶触摸。我有一个奇怪的问题。使用选择字段的视图未在 Android 模拟器上显示,但在 Google Chrome 中显示。它以前工作得很好,我猜不出是什么改变了“破坏”它。

在模拟器 logcat 中,我可以看到以下三个消息:

E/ActivityThread(243):无法找到 android.server.checkin 的提供者信息

W / Checkin(243):无法更新统计BROWSER_SNAP_CENTER:java.lang.IllegalArgumentException:未知的URL内容://android.server.checkin/stats

D/CordovaLog(243):未定义:第 1 行:TypeError:表达式“c”[null] 的结果不是构造函数。

有时只显示第三个。以下是查看代码:

(function() {
    var setSettingValue = function(component, query, value) {
        var c = component.query(query);
        if (c && value && (c.length > 0)) {
            c[0].setValue(value);
        }
    };
    var createToolbar = function () {
    return Ext.create('Ext.Toolbar', {
        xtype: 'toolbar',
        docked: 'bottom',
        layout: { pack: 'center' },
        items: [
            { 
                iconMask: true, ui: 'normal', iconCls: 'info',
                itemId: 'infoButton'
            },
            { xtype: 'spacer' },
            { 
                iconMask: true, ui: 'normal', iconCls: 'reply',
                itemId: 'backButton'
            }
        ]
    })};
    Ext.define('MyWF.view.Settings', {
        extend: 'Ext.Container',
        initialize: function ()
        {
            this.setItems([createToolbar()]);
            this.callParent();
        },
        config : {
            layout : 'vbox',
            padding : '0 10',
            scrollable: {
                direction: 'vertical'
            },
            onBackAction: function () { console.log('back'); },
            onInfoAction: function () { console.log('info'); },
            listeners: [{
                delegate: "#backButton",
                event: 'tap',
                fn: 'onBackAction'
            },
            {
                delegate: "#infoButton",
                event: 'tap',
                fn: 'onInfoAction'
            },
            {
                event: 'show',
                fn: function(component, eOpts) {
                    setSettingValue(component, 'selectfield[name=windMU]','kmh');
                    setSettingValue(component,'selectfield[name=temperatureMU]','C');
                }
            }],
            items : [{
                xtype : 'fieldset',
                title : 'Measure units',
                items : [{
                    xtype : 'selectfield',
                    name : 'temperatureMU',
                    label : 'Temperature',
                    labelAlign: 'top',
                    listeners : {
                        change : function(selectField, newData, oldData, eOpts) {
                            alert('Your choice is: ' + newData);
                        }
                    },
                    options : [{
                        text : 'Celsius',
                        value : 'C'
                    }, {
                        text : 'Farenheit',
                        value : 'F'
                    },]
                }, {
                    xtype : 'selectfield',
                    name : 'windMU',
                    label : 'Wind speed',
                    labelAlign : 'top',
                    listeners : {
                        change : function(selectField, newData, oldData, eOpts) {
                            alert('Your choice is: ' + newData);
                        }
                    },
                    options : [{
                        text : 'Kilometers per hour',
                        value : 'km/h'
                    }, {
                        text : 'Meters per second',
                        value : 'm/s'
                    }, {
                        text : 'Miles per hour',
                        value : 'MPH'
                    }, {
                        text : 'Knots',
                        value : 'kn'
                    }]
                }]
            },]
        }
    });
})();

感谢您的任何建议

4

1 回答 1

1

好吧,我有一些时间来解决这个问题。首先,我在问题中添加了一个缺少的信息:我正在使用 Sencha Touch 库的自定义构建运行应用程序,库版本是 2.0.1.1。

在 Google Chrome 上,选择字段 (Ext.field.Select) 默认为 choiches 列表创建一个Ext.dataview.List实例,而在手机上创建一个Ext.picker.Picker

但是Ext.picker.Picker还创建了一个Ext.TitleBar,这是我自定义的 sencha 库构建中缺少的,而Ext.dataview.List类在其中。

因此应用程序可以在 Chrome 中显示选择字段,但不能在模拟器中显示,并且它给出了不明确的消息,因为 libary 构建被压缩和混淆。

有两种解决方案:

  1. 您也可以在模拟器或手机中强制使用列表。Ext.picker.Picker类有一个创建选项:"usePicker: false",默认设置为 "auto"。

  2. 或者,更好的是,在应用文件中添加对标题栏组件的显式引用:“ Ext.require('Ext.TitleBar'); ”以将其包含在库构建中。

我看到了强制在 Chrome 中使用选择器的问题,方法是设置选择器配置“ usePicker: true ”,并使用调试库构建“sencha-touch-debug.js”运行应用程序,请参阅http://docs。 sencha.com/touch/2-0/#!/api/Ext.Loaderhttp://docs.sencha.com/touch/2-0/#!/guide/building

然后在 Chrome 控制台以及 Android 模拟器 logcat 中,我看到了明确的消息:

[WARN][Anonymous] [Ext.Loader] Synchronously loading 'Ext.TitleBar'; 
consider adding 'Ext.TitleBar' explicitly as a require of the corresponding class 

一个建议:在 logcat 中最好过滤许多消息,例如在过滤器掩码中写入“Ext.Loader”。

于 2012-11-06T22:28:40.143 回答