Titanium News

Appcelerator Titanium Mobileに関するニュースなどを淡々とお伝えしていきます。

Titanium SDK 3.0における互換性に影響する変更点について

昨日、公式ブログにて公開されていた記事Breaking Changes in Titanium SDK 3.0超訳になります。


2.1.4以前のTitanium SDKから互換性に影響する変更点として大きく5つ挙げられています。

  • Android関連
  • TabGroupの変更
  • AtivityIndicatorの変更
  • Rhinoランタイムエンジンの公式サポートの終了
  • 1.8でdeprecatedとなっていたAPI群の除去
  • iOSのGroupded TableView背景に関する変更(2.1.4における変更)

Android関連

TabGroup自体の変更

TitaniumからActionBarを利用するため、TabGroupの動作に変更が必要となった。このため、ActionBarの利用有無に関わらずTabGroupを利用するすべてのAndroidアプリケーションに影響します。

Action Bar Tabs

Android SDK 11(Android 3.0/Honeycomb)以降でアプリケーションビルドを行う際、TabGroupは従来の旧式TabGroup表示に代わり、Action Bar Tabsとして表示されます。

もしすでにこのバージョンでビルドをしている場合、Titanium SDK 3.0でビルドした段階からその影響を受け、外観が変更されます。

TabGroupのActivityについて

以前のSDKバージョンでは、TabGroupのWindowはそれぞれ固有のActivityを有していましたが、Titanium SDK 3.0ではTabGroup.activityとして公開されるAndroid ActivityをTabGroup自体が持ち、個々のTab内のWindowはこのActivityで共有されます。

例えば、これまでのバージョンでそれぞれのWindowに異なるメニューを作成している場合、今後このTabGroupに対してonCreateOptionsMenuコールバックは一つしか関連付けられないため、この変更の影響を受けるでしょう。

タブ切替時にメニューを切り替えるためには、新しく使用できるようになったActivity.invalidateOptionsMenuメソッドをメニューの内容を更新するたびに使用します。

アプリケーションのタイトルバー

これまでのTitanium SDKではTabGroupは自動的にフルスクリーンとなり、タイトルバーは表示されませんでした。Titanium SDK 3.0ではデフォルトが変更され、初期状態では(iOSのTabGroup同様に)タイトルバーが表示されます。

この挙動を従来通りにするにはTabGroup.navBarHiddenプロパティをtrueに設定します。これと同様の挙動をするWindow.navBarHiddenプロパティもTitanium SDK 3.0で追加されました。

ActivityIndicatorの変更

Titanium SDK 3.0ではAndroid用ActivityIndicatorをiOS・Mobile Webとの差を埋めるため再実装されました。古いActivityIndicatorはモーダルダイアログとして表示あsれていましたが、新しいActivityIndicatorはiOSやMobile Webと同様にWindowやView内に追加した上で表示されるようになります。(ただしWindowのタイトルバー上には配置できない)

さらに従来Ti.UI.iPhone.ActivityIndicatorStyleで提供されていた定数と同じ内容が含まれるTi.UI.ActivityIndicatorStyleがAndroidとMobile Webでサポートされるようになりました。

Android独自のProgressIndicatorについては従来のActivityIndicatorの挙動をとります。モーダルダイアログもしくはWindowタイトル上のプログレスバーとしてProgressIndicatorを使用できます。

新しいActivityIndicatorはViewに追加しなければならないため、従来のActivityIndicatorを使用するコードは利用できません。

Titanium SDK 3.0に対応したコードに更新するには、ProgressIndicatorに切り替えて従来動作を維持するか、もしくはiOSのようなActivityIndicatorの使用方法に切り替える必要があります。

例えば、ActivityIndicatorについて次のように書いていたとします。

var activityIndicator = Ti.UI.createActivityIndicator({
  color: 'green',
  font: {fontFamily:'Helvetica Neue', fontSize:26, fontWeight:'bold'},
  message: 'Loading...',
  style:Ti.UI.iPhone.ActivityIndicatorStyle.DARK,
  top:10,
  left:10,
  height:'auto',
  width:'auto'
});

// On iOS, the activity indicator must be added to a window or view for it to appear
if (Ti.Platform.name === 'iPhone OS'){
  win2.add(activityIndicator);
}

しかしこのままでは、iOSとAndoridで見た目が異なり、Mobile Webではまったく動作しません。次のように変更することで、3つのプラットフォームに対応し、同じ結果を得ることができます。

var activityIndicator = Ti.UI.createActivityIndicator({
  color: 'green',
  font: {fontFamily:'Helvetica Neue', fontSize:26, fontWeight:'bold'},
  message: 'Loading...',
  style: (Ti.Platform.name === 'iPhone OS' ? Ti.UI.iPhone.ActivityIndicatorStyle.DARK : Ti.UI.ActivityIndicatorStyle.DARK),
  top:10,
  left:10,
  height:'auto',
  width:'auto'
});

win2.add(activityIndicator);

モーダルダイアログとして利用する場合には先ほどのコードの先頭部を次のように置き換えます。

var activityIndicator;
if (Ti.Platform.name === 'android') {
  activityIndicator = Ti.UI.Android.createProgressIndicator({
    message : 'Loading...',
    location : Ti.UI.Android.PROGRESS_INDICATOR_DIALOG,   // display in dialog
    type : Ti.UI.Android.PROGRESS_INDICATOR_INDETERMINANT // display a spinner
  });
} else {
  activityIndicator = Ti.UI.createActivityIndicator({
    ... // etc.

Rhinoランタイム用の公式サポート終了

RhinoランタイムはTitanium SDK3.0では公式サポートされなくなりました。大半の開発者がV8エンジンを用いており、両方のランタイムを維持するコスト増を避けるため、Rhinoのサポートを停止することとしました。

Titanium Studio 3.0以降ではビルド時にランタイム選択肢にRhinoを提示しません。 しかしRhino自体はSDKに含まっており、tiapp.xmlファイルのti.android.runtimeプロパティを手動で加えることにより有効にすることができます。

API廃止

次に挙げるAPIは今回のリリースで除去されました。なお、これらはすべて1.8以前より廃止に向けた非推奨APIとなっていました。

  • Titanium.Media.VideoPlayer.contentURL
    →(推奨される移行API)Titanium.Media.VideoPlayer.urlプロパティ
  • Titanium.Network.addConnectivityListener
    →(推奨される移行API)Titanium.Network.chageイベント
  • Titanium.Network.removeConnectivityListener
    →(推奨される移行API)Titanium.Network.chageイベント
  • Titanium.UI.ImageView.url →(推奨される移行API)Titanium.UI.ImageView.imageプロパティ
  • Titanium.UI.orientationプロパティ →(推奨される移行API)Titanium.UI.Window.orientationModesプロパティ

iOSにおけるGroupded TableViewの背景の変更(2.1.4変更)

これは3.0での変更ではありませんが、2.1.4における利用者の混乱と同様に、3.0でも混乱を引き起こす可能性があるため、改めて注意喚起します。

Titanium SDK 2.1.3以前ではiOSのTableViewの背景色のデフォルトは透明色でした。 グループ化されたTableViewの背景テクスチャを設定するには"stripped"もしくはTi.UI.iPhone.COLOR_GROUP_TABLEVIEW_BACKGROUNDを明示的に指定する必要がありました。

Titanium SDK 2.1.4以降では、(iOS SDK 6での変更点に追随するため)これが逆転します。
グループ化されたTableViewはデフォルトでiOSのシステム背景テクスチャが設定されます。 ViewやWindowの背景画像を透けて表示させるためにはTableViewの背景色として明示的に"transparent"を指定しなければならなくなりました。