kitak blog

Kみたいなエンジニアになりたいブログ

Titanium MobileでTab Barを非表示にする際の副作用の解決(Android)

下の記事の「まとめ」で取り上げている問題について, ベストな方法かどうかは分かりませんが解決できたので書いておきます。
Titanium Mobileで作る! iPhone/Androidアプリ:第14回 iPhoneサンプルアプリをAndroidに対応させる|gihyo.jp … 技術評論社

現時点でのTitanium Mobile SDKのバージョンは1.7.2。 今後のアップデートでこの問題は解決される可能性があります。

Titanium MobileでAndroidアプリを作る際はTab Groupを使うことでいくつかのメリットがあります。

  • menuを使うことが出来る
  • Ti.UI.currentTab.open(win);と書くことで,端末の「戻る」ボタンで前のウィンドウに遷移してくれる。単純にwin.open();だと「戻る」ボタンを押すとアプリが終了してしまう。

(上記のことはTab Groupを使わなくても可能でした。 おそらくiPhoneではTab Groupでしか使えない機能があるので,iPhone,Android両方対応のコードを書く際に問題になるみたいです)

ただ,Tabをひとつしか使わない場合にTabを表示しておくのは不細工です。 そこでwin.hideTabBar();と書くことでTabBarを消すことができる・・・はずなのですが, iPhoneではうまくいくのにAndroidではうまくいかないのです。
そもそも, この問題の根本はwin.hideTabBar();が効かないことにあります。

f:id:kitak:20110809222727p:image:w200

ばっちりTab1って出てますよ・・・。そこで倉井さんの記事では,ちょっとしたテクニックを用いて解決しようとしています(詳しくは一番上のURLを参照のこと)。

f:id:kitak:20110809222947p:image:w200

おお・・・うまくいった。 と, 喜んだのも束の間,ここで「戻る」ボタンを押すと
f:id:kitak:20110809222727p:image:w200

またお前かい! 最後に出てきちゃうんです。

それが記事の「まとめ」に書かれている問題です。この問題を解決するために色々試行錯誤して苦しみました。 イベントをfireしたり,ごにょごにょしたり・・・でも全くの反応なし。
悩んでいたのですが,シンプルにこう考えました。 dummy.jsのwin1を閉じるときに最後に出てくるウィンドウも一緒に消したらどうだろうか?

実装は簡単ですが, dummy.jsにこう記述します。
winにはTi.UI.currentWindowが代入されています。
win1は, dummy.js内で生成され,Ti.UI.currentTab.open()で開くウィンドウです。

 win1.addEventListener('close', function (e) {
      win.close();
 });

単純ですが,これでうまくいきました。 どうでしょうか?