Android 4でPicker(Titanium.UI.PICKER_TYPE_TIME)
またまたAndroid BK通信です。
Titanium Mobileは正式にはAndroid 4に対応していません。しかし、Androidもさすがにアホじゃないので下位互換性はほぼ保たれているため、ほとんどの場合は問題なく動作します。
という書き方をすればお気付きかもしれませんが、当然動かない場合もあります。今日はそのような問題のひとつ、Pickerについて報告します。
Android 4からTimerPicker.javaにupdateInputStateという関数が追加されています。Titanium MobileでcreatePickerした際にtypeプロパティをTitanium.UI.PICKER_TYPE_TIMEにすると、このTimerPickerが呼び出されるのですが、実はこのupdateInputState関数には問題があって、IME経由でPickerの値を変更した場合はいいのですが、+ボタンや−ボタンで変更すると入力値のチェックが甘くNullPointerExceptionでクラッシュしてしまいます。報告が上がってはいますが、修正はされていません。
var win = Ti.UI.createWindow(); var picker = Ti.UI.createPicker({type:Titanium.UI.PICKER_TYPE_TIME}); win.add(picker); win.open();
これだけのコードで再現しますが、Android 3以下では動作しても4からはボタンで値を更新しようとするとクラッシュします。数字をタップしてIME経由で数字を入力すると落ちません。
というわけで、Android 4に対応する必要がある方はTitanium.UI.PICKER_TYPE_TIMEは諦めて
var win = Ti.UI.createWindow(); var hours = Ti.UI.createPickerColumn({width:Titanium.Platform.displayCaps.platformWidth/2}); for(var i = 0; i <= 24; i++){ var row = Ti.UI.createPickerRow({title:i.toString() + '時'}); hours.addRow(row); } var mins = Ti.UI.createPickerColumn({width:Titanium.Platform.displayCaps.platformWidth/2}); for(var i = 0; i <= 59; i++){ var row = Ti.UI.createPickerRow({title:i.toString() + '分'}); mins.addRow(row); } var picker = Ti.UI.createPicker({width:Titanium.Platform.displayCaps.platformWidth, useSpinner:true, columns:[hours, mins]}); win.add(picker); win.open();
とかで逃げるしかありません。
コメントを残す