T

Android 4でPicker(Titanium.UI.PICKER_TYPE_TIME)

またまたAndroid BK通信です。

Titanium Mobileは正式にはAndroid 4に対応していません。しかし、Androidもさすがにアホじゃないので下位互換性はほぼ保たれているため、ほとんどの場合は問題なく動作します。

という書き方をすればお気付きかもしれませんが、当然動かない場合もあります。今日はそのような問題のひとつ、Pickerについて報告します。

Android 4からTimerPicker.javaupdateInputStateという関数が追加されています。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();

とかで逃げるしかありません。

Posted by on 5月 14, 2012 in Android, Titanium, Tuit

コメントを残す