2011年3月24日木曜日

Android Tabのうち1つを表示させない

AndroidでTabを使うには、TabHostとTabWidgetを使えば良い。Tab Layout | Android Developersに使い方もあるし、ググれば日本語でも誰かのサンプルがたくさん見れるので割と簡単に使えると思う。

で、今回は「メイン」「カテゴリ」「検索」という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に変えてやるってのがなんとも言えずなイケてない。

まだまだここは改善の余地はあるんだろうが、そこは課題ということで。今日はここまで。