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"を指定しなければならなくなりました。