1

私はSenchaTouchを学んでいます。奇妙な問題が発生しています。選択フィールドを使用したビューは、Androidエミュレーターでは表示されませんが、GoogleChromeでは表示されます。以前は問題なく動作しましたが、何が「壊れた」のかは推測できません。

エミュレータのlogcatで、次の3つのメッセージを確認できます。

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]の結果はコンストラクターではありません。

3番目だけが表示されることもあります。以下、ビューコード:

(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

さて、私は問題を修正するために少し時間がありました。まず、不足している情報を質問に追加します。SenchaTouchライブラリのカスタムビルドでアプリを実行していました。ライブラリのバージョンは2.0.1.1です。

Google Chromeでは、選択フィールド(Ext.field.Select)がデフォルトでchoichesのリストのExt.dataview.Listインスタンスを作成しますが、電話ではExt.picker.Pickerが作成されます。

しかし、Ext.picker.PickerはExt.TitleBarも作成します。これは、 Ext.dataview.Listクラスが含まれている間、senchaライブラリのカスタムビルドにはありませんでした。

そのため、アプリケーションはChromeで選択フィールドを表示できますが、エミュレーターでは表示できません。また、ライブラリビルドが圧縮されて難読化されているため、不明確なメッセージが表示されます。

2つの解決策があります:

  1. エミュレーターまたは電話でもリストの使用を強制できます。クラスExt.picker.Pickerには、このための作成オプションがあります:"usePicker:false"、デフォルトでは"auto"に設定されています。

  2. または、アプリファイルのタイトルバーコンポーネントへの明示的な参照を追加することをお勧めします: " Ext.require('Ext.TitleBar'); "ライブラリビルドに含めます。

ピッカー構成「 usePicker:true」を設定し、デバッグライブラリビルド「sencha-touch-debug.js」を使用してアプリを実行することにより、Chromeでピッカーを強制的に使用する際の問題が発生しました。http://docsを参照してください。 sencha.com/touch/2-0/#!/api/Ext.Loader、およびhttp://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 に答える