Titanium.UI.setBackgroundColor('#000');
var tabGroup = Titanium.UI.createTabGroup();
Titanium.include('soundPlayer.js');
Titanium.include('timer.js');
Titanium.include('twitter.js');
// open tab group
tabGroup.open();
あくまでもinclude なのでクラスのような使い方はできないですが、用途別のコード整理には必須ですね。
var twitterWindow = Titanium.UI.createWindow({
title:'Twitter',
backgroundColor:'#000000',
url: 'twitterLoadTimeline.js'
});
twitterWindow.message = "Twitterの読み込み";
読み込まれる側では、Titanium.UI.currentWindw で呼び出し側の Window を取得できます。
var twitterWindow = Titanium.UI.currentWindow;
alert(twitterWindow.message);
var twitterTableView = Titanium.UI.createTableView();
twitterWindow.add(twitterTableView);
var url = "http://api.twitter.com/1/statuses/user_timeline.json?screen_name=yoo_yoo_yoo";
if (Titanium.Network.onLine == false) {
alert('オフラインです');
} else {
var xhr = Titanium.Network.createHTTPClient();
xhr.open("GET", url, false);
xhr.onload = function () {
var json = JSON.parse(this.responseText);
var tableViewData = [];
for (var i = 0; i < json.length; i++) {
tableViewData.push({title :json[i].text});
//Titanium.API.info(json[i].user.screen_name);
//Titanium.API.info(json[i].text);
}
twitterTableView.data = tableViewData;
};
xhr.onerror = function (error) {
alert(error);
}
xhr.send();
}
createWindowのスコープ内のプロパティも後で設定したプロパティ取得、つまりコンテキストが受け渡されます。
これは素晴らしい!
var messageWindow = Titanium.UI.createWindow({
url: 'messageLoader.js'
});
messageWindow.open();
var messageTab = Titanium.UI.createTab({
title:'Message',
window:messageWindow
});
Titanium.App.addEventListener('showMessage', function(e) {
alert(e.profile.name);
});
tabGroup.addTab(messageTab);
Titanium.App.fireEvent('showMessage', {
message: 'プロフィール',
profile: {
name: 'yoo',
url: 'http://yoo-s.com'
}
});
ウィンドウ作成後に 登録した「showMessage」イベントを呼び出しています。 果たして本当に効率よく作れるか? 限界はどこまでか?
スクリプト言語なんでファイル構成が悩ましいところですが、まずは簡単なサンプルから。
//TabGroup作成
var tabGroup = Titanium.UI.createTabGroup();
//Window作成
var topWindow = Titanium.UI.createWindow({
title:'Top',
backgroundColor:'#000000'
});
//タブ画面作成
var topTab = Titanium.UI.createTab({
icon:'KS_nav_views.png',
title:'Top',
window:topWindow
});
//ラベル作成
var label1 = Titanium.UI.createLabel({
color:'#999',
text:'I am Window 1',
font:{fontSize:20,fontFamily:'Helvetica Neue'},
textAlign:'center',
width:'auto'
});
//Window に Label を追加
topWindow.add(label1);
//TabGroup に Tabページを追加
tabGroup.addTab(topTab);
//TabGroup を開く
tabGroup.open();
非常にわかりやすくて、簡単ですね。
ただ、全部コーディンしなきゃいけない
って事を考えると、画面設計を作るのはちょっと???という印象です。 InterfaceBuilder がいかに素晴らしいかってのがよくわかります。 しかし、Objective-C や Java では書くのが面倒くさい事を Titanium で簡単に実装できてしまったりします。
var twitterTableView = Titanium.UI.createTableView();
twitterWindow.add(twitterTableView);
var url = "http://api.twitter.com/1/statuses/user_timeline.json?screen_name=yoo_yoo_yoo";
if (Titanium.Network.onLine == false) {
alert('オフラインです');
} else {
var xhr = Titanium.Network.createHTTPClient();
xhr.open("GET", url, false);
xhr.onload = function () {
var json = JSON.parse(this.responseText);
var tableViewData = [];
for (var i = 0; i < json.length; i++) {
tableViewData.push({title :json[i].text});
}
twitterTableView.data = tableViewData;
};
xhr.onerror = function (error) {
alert(error);
}
xhr.send();
}
iPhone は UITableView Delegateメソッド 、Android は ArrayAdapter を記述しますが、
結構長いコーディングになりがちです。
(それだけ細かい事ができるという事ですが)
Titanium の場合、上記のような処理だけで動いてくれます。
素晴らしいのは、createHTTPClient() 移行の書き方です。
ちなみに、 open() の第3引数は同期/非同期の設定で、iPhone のみ有効です。
という訳で、何の処理が簡単に書けるか?を知るのが大切かと思います。
ちなみに、Twitter に関しては、iOS5ではもっと簡単にかけてしまいますが(笑) [ERROR] Error: Traceback (most recent call last): File "/Library/Application Support/Titanium/mobilesdk/osx/1.7.0/iphone/builder.py", line 1139, in main execute_xcode("iphonesimulator%s" % link_version,["GCC_PREPROCESSOR_DEFINITIONS=__LOG__ID__=%s DEPLOYTYPE=development TI_DEVELOPMENT=1 DEBUG=1 TI_VERSION=%s %s" % (log_id,sdk_version,debugstr)],False) File "/Library/Application Support/Titanium/mobilesdk/osx/1.7.0/iphone/builder.py", line 1057, in execute_xcode output = run.run(args,False,False,o) File "/Library/Application Support/Titanium/mobilesdk/osx/1.7.0/iphone/run.py", line 39, in run sys.exit(rc) SystemExit: 1
何度かプロジェクトを作り直してもだめ。 appcelerator のフォーラム見たら、 What is this error? うーん、やっぱりプロジェクト削除や、ビルド再構築すればよいの? と言ういか、App ID の入力でパッケージ指定(com.yoos.XXXX)してなかった事に気づく。・iOS:XCode4(iOS4.3)に対応 ・iOS:Facebook認証の修正(iOS3.1.x系とSafari未対応機種) ・Android:JavaScriptコンパイルのUTF-8エンコーディング対応 ・Android:ActivityとWindowのライフサイクル問題修正 ・Android:Intent のフラグ対応
Android も iOSもJSインタプリタで動作している
超基本的な事でした。。。Luaを覚えなきゃいけないし、開発環境がイマイチ
Flasherの人には良いかもしれないが、開発環境的にちょっと非効率的な気もする。 またバリバリのゲームだったら、試してはいないけどUnity 3Dの選択肢もあるかも知れない。 とりあえずCoronaもアンテナだけは張っておくとして、今月のWeb+DBでも紹介されていたTitanium Developerを試してみた。/Library/Application\ Support/Titanium
また、自動的に最新アップデータするか?と聞いてくるのでアップデートする。 次に、AndroidSDKのパスを選択する必要がある(iPhoneは自動認識)。 Android SDK 2.3.1以前では/Developer/android-sdk-mac_x86/platform-tools/adb
のパスでは起動しないので、/Developer/android-sdk-mac_x86/tools/
へadbをコピーしてから選択する。