2011年4月2日土曜日

Android 1つ目のTabのActivityを起動させない

TabHostでタブを追加すると、1つ目に追加したタブは必ず起動されてしまう。必要なタブを追加した後にsetCurrentTabで1つ目以外のタブを指定しても。できればタブを切り替えたときにstartしてほしいので調べる。

結論、調べたけど起動させないのは無理のようだ。

android - How to prevent starting the activity at the first tab in a TabActivity? - Stack Overflow
同じ質問してる人はいたのだが、回答は「デフォルトが最初になるようタブを並べ直してはどう?」って解決しないし。見た目が変わるので並び替えはダメだろう。

ここでやりたいことを書いておく。
まず、A、Bという2つのタブをもつTabActがある。Bタブ内のイベントでCに移るのだが、A、Bのタブは残しておきたい。
タブは残したいので、TabActを継承したSubTabActを起動する。SubTabActで、C用のTabを非表示で追加してcurrentタブとする。
すると、1つ目のタブAとcurrentタブCが起動されてしまう。AsyncTaskではあるけどAの処理も重いのでちょっと困ったなって感じ。

1つ目のタブを起動させないのは無理なら、1つ目のタブを何もしないダミーのactivityにして非表示で追加してやれば良いのか。TabActのonCreateで1つ目のタブを追加する前に下記追加。
        if (!this.getClass().equals(MainTabAct.class)) {
            intent = new Intent().setClass(this, DummyAct.class);
            spec = tabHost.newTabSpec("dummy").setIndicator("dummy").setContent(intent);
            tabHost.addTab(spec);
            tabHost.getTabWidget().getChildAt(0).setVisibility(View.GONE);
        }
継承したクラスから呼ばれた場合は何もしないDummyActを1つ目のタブになるように追加。このif文は自分のやりたいこと的に継承の場合だけdummyを追加したかったので、自分用につけてあるだけ。常にdummyを1つ目としたいならなくていいじゃん。

タイトルの「1つ目のTabのActivityを起動させない」にはなっていないのだけれど、デフォルトが1番目になるように並べ替えるよりはいいだろう。ということで、「何もしないダミーのactivity(※)を1つ目のタブにセットして非表示にする」ことで1つ目のタブを2つ目のタブにしちゃって起動させない。

※何もしないダミーactivityと言っても、ホントに何もしないわけではない。そんなこと注釈しないでもわかるか。

なんかやっていて思ったが、結局SubTabActのタブでAに移れば重い処理は走る。TabAct時に実行した結果と同じ画面を表示するためなのに。自分のやりたかったことは、1つ目のタブを起動させないというよりはAをSingletonのような感じにしたかったのかな。もう少し勉強だ。

※追記
Sinlgetonではないけれど、やりたいことは「タブ内のActivityからタブを操作する 」でも行えた。