# Titanium Mobileの暗黒ノウハウを公開します。主にAndroid編。 _published: 2011/05/23_ ![alt](http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/shunsuk/20110523/1306141357) すこし前の話になりますが、Titaniumを使ってiPhoneアプリとAndroidアプリを同時リリースしました。iPhoneアプリの方は、以前公開した暗黒ノウハウでわりと楽に作れました。問題は、Android。iPhoneとは違う暗黒ノウハウが必要となりました。 - [[Titanium Mobileの暗黒ノウハウを公開します。]] 今回は、ボリューム少なめです。もう少したまってから公開しようと思ったのですが、Objective-Cを使った開発に戻ったので、しばらくTitaniumは使わないだろうということで公開することにしました。そうそう、日本語でTitaniumの書籍が出るみたいですね。 ## Android対応 TitaniumはiPhone対応が先行していて、Androidだと機能がなかったりバグがあったりするそうです。私はわりとどうでもいいアプリしか作ってないので、それほど困りませんでした。みんな、どうでもいいアプリを作ればいいんじゃないでしょうか。 ## マルチプラットフォーム開発 iPhoneアプリとAndroidアプリを同時に開発しました。といっても、両方でテストしつつ開発したわけではありません。AndroidのエミュレータよりもiOSシミュレータの方が起動が速いので、先にiPhoneアプリをがっつり作るのがいいと思います。で、Androidので動かしてみてガッカリすればいいんじゃないでしょうか。 私はひとつのコードでiPhoneとAndroidに対応しましたが、内部的にはifで処理を分けたりしていて残念な感じです。JavaScriptは自由度が高いぶんゴチャゴチャしたコードになりやすいので、薄めのフレームワークとかつくるといいかもしれません。で、ViewやModelをしっかり別けて、ModelをiPhoneとAndroidで共有するといいでしょう。Viewはさらに共用できるところとできないところに分離したいところです。で、無理やりマルチプラットフォームにしようとして設計がえらいことになればいいんじゃないでしょうか。 ## Androidエミュレータ 起動が遅い。遅い。かと言って実機も転送速度的な何かが遅くて、結局エミュレータで開発しました。Android開発の経験がなくて知らなかったのですが、エミュレータはいちいち再起動しなくていいんですね。起動しっぱなしでOKなようです。Titanium DeveloperでStopボタンを押すとエミュレータが終了してしまうので、押さないようにします。起動に時間がかかるのを言い訳に2chなんかを見たかったら、毎回再起動すればいいんじゃないでしょうか。 ## 何かがおかしいとき 自分は悪いことしてないのに、うまく動かないという理不尽なことってありますよね。Titaniumは特にそれが多い気がします。その場合の対処法です。このどれか、もしくは全部を試してみてください。 - エミュレータを再起動。 - Titanium Developerを再起動。 - tiapp.xmlを書き換え。 tiapp.xmlを書き換えると、内部的にクリーンな状態になるのだと思います。知らんけど。それでうっかり設定内容をありえない内容にして一生動かない感じになればいいんじゃないでしょうか。 ## 言語仕様が違う? iPhoneアプリを作るときに使っていたコード、これがAndroidだと動きません。 ```js var info = Ti.API.info; Object.prototype.test = function() {}; ``` このレベルで差が出るとは思いませんでした。でも、事実です。もう、AndroidはJavaで書いたらいいんじゃないでしょうか。 ## コードの分岐 iPhoneとAndroidで処理を分けるには、こんなコードを書いておくと便利です。 ```js var isAndroid = Ti.Platform.name == 'android'; ``` そもそも、このコードを書いた時点で、かなり残念な気持ちになりますよね。もう、AndroidはScalaで書いたらいいんじゃないでしょうか。 ## UIパーツのサイズ指定 iPhoneとAndroidだとスクリーンのサイズが違います。また、Androidでもデバイスによってバラバラです。そこで、UIパーツのサイズを%で指定してみました。iPhoneだと思い通りのサイズになりましたが、Androidだと見事に崩れました。なんとなくうまくいく方法としては、スクリーンの横幅を320として指定すると、うまいこと調節してくれます。ただ、縦横比がちがうので、縦を480として指定していると、Androidでは隙間が空いたりします。まあ、隙間とか気にしなくていいんじゃないでしょうか。 ## TableView AndroidはTableViewのeditingが使えません。テーブルの行を削除したり並び替えたりするあれです。私はAndroidを使わないので、一般的なAndroidアプリがテーブルの編集をどう実装しているのかわかりません。とりあえず、iPhoneのUITableViewのeditingと同じものを自力で実装しました。Titaniumの挙動不審さも相まって、ここが一番時間がかかりました。AndroidだとどういうUIにすればいいのか研究したいので、私にGALAXY S ?を買ってくれればいいんじゃないでしょうか。 ## Viewの非表示 iPhoneだと、これで非表示になります。 ```js var button = Ti.UI.createButton(); button.hide(); ``` Androidだと非表示になりません。下のように書くと非表示になります。ですが、いざ表示させようとすると表示されません。 ```js var button = Ti.UI.createButton({ visible: false }); ``` そこで、Windowのopenイベントで非表示にするとうまくいきます。 ```js window.addEventListener('open', function(e) { button.hide(); } ); ``` AndroidはViewの表示非表示の挙動がおかしいので、すごく苦労しました。みなさんも、苦労すればいいんじゃないでしょうか。 ## WebView 複数のWebViewを切り替えるアプリを作りました。案の定、iPhoneだとうまくいきます。案の定、Androidだとうまくいきません。何が問題かというと、Androidの場合、WebViewは1つのWindowに1つしか置いてはいけません。操作が効かなくなります。タブで切り替える場合は、1つのタブに1つのWindowなのでOKです。これはTitaniumのバグっぽいので、直るまでアプリ開発をやめとけばいいんじゃないでしょうか。 いろいろ書きましたが、まとめると、TitaniumのAndroid対応はまだまだです。Titaniumはオープンソースなので、自分で修正してパッチを送ったらいいいんじゃないでしょうか。あと、スシが食べたい。