で、今回は「メイン」「カテゴリ」「検索」という3つのタブを使い、メインはデフォルト表示されるものでタブには含めたくない。そんなときにどうすれば良いのかをまとめておく。
なかなか上手く調べられなく時間はかかったけど、下記の1行で1つ目のタブを消せる。
getTabHost().getTabWidget().getChildAt(0).setVisibility(View.GONE);
でも、これだとタブが見えなくなるので、一度別のタブを選んでしまうと戻れなくなる。currentのタブが再度クリックされたら、デフォルトのタブがcurrentになるようにしてやるなど対応がいるだろう。 @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TabHost tabHost = getTabHost();
TabHost.TabSpec spec;
Intent intent;
intent = new Intent().setClass(this, MainAct.class);
spec = tabHost.newTabSpec("main").setIndicator("メイン").setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, CategoryAct.class);
spec = tabHost.newTabSpec("category").setIndicator("カテゴリ").setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, SearchAct.class);
spec = tabHost.newTabSpec("search").setIndicator("検索").setContent(intent);
tabHost.addTab(spec);
OnClickListener ocl = new OnClickListener() {
@Override
public void onClick(View v) {
View current = getTabWidget().getChildAt(
getTabHost().getCurrentTab());
if (current.equals(v)) {
getTabHost().setCurrentTab(0);
} else {
int tabs = getTabWidget().getChildCount();
for (int i = 0; i < tabs; i++) {
View tab = getTabWidget().getChildAt(i);
if (tab.equals(v)) {
getTabHost().setCurrentTab(i);
break;
}
}
}
}
};
tabHost.getTabWidget().getChildAt(0).setVisibility(View.GONE);
tabHost.getTabWidget().getChildAt(1).setOnClickListener(ocl);
tabHost.getTabWidget().getChildAt(2).setOnClickListener(ocl);
}
これで、ひとまずやりたいことはできた。ただ、clickListenerでのfor文とかちょっとダサい気はする。やりたいことはベタで書くと下記の通り。
tabHost.getTabWidget().getChildAt(1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (getTabHost().getCurrentTab() == 1) {
getTabHost().setCurrentTab(0);
} else {
getTabHost().setCurrentTab(1);
}
}
});
tabHost.getTabWidget().getChildAt(2).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (getTabHost().getCurrentTab() == 2) {
getTabHost().setCurrentTab(0);
} else {
getTabHost().setCurrentTab(2);
}
}
});
これだとtab追加になったときを考えると、コピーして1(または2)となってる3ヶ所を3に変えてやるってのがなんとも言えずなイケてない。まだまだここは改善の余地はあるんだろうが、そこは課題ということで。今日はここまで。