2011年9月7日水曜日

Android Tabを入れ子(ネスト)にする

タブをネストしたいときってあると思います。
アプリ作ってた時に参考にしたアプリがネストしてて、確かに情報的にそうなるよな、と思った。でも、作ってみたら、どうやるんだろ、と。

初めてタブを作った時にググったら、TabActivityを使うのと使わないのがあって、じゃあ、TabActivityで作ったタブの中で、使わない方法のタブ作りを、と思いました。

でも、なんか上手くいかなくて、調べてたら、タブの中にActivityを入れる方法が。
あ、これでTabActivityの中にTabActivity入れればいいんじゃないか、と。

サンプル。
メインのxml

    
 
 
 
 
 
         
  

    


ネストしたタブ

    
 
 
 
 
     
     
 
 
     
   
 
     


で、Activity
TabSampleActivity.java
ポイントは
tab2.setContent(new Intent(this, NestTabActivity.class));
インテントを入れること。

import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabHost.TabSpec;

public class TabSampleActivity extends TabActivity implements OnTabChangeListener{
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        TabHost tabHost = getTabHost();  
        // Tab が切り替わったときに呼ばれるコールバックを登録  
        tabHost.setOnTabChangedListener(this);  
      
        /********** Tab その1 **********/  
        // TabSpec の作成  
        TabSpec tab1 = tabHost.newTabSpec("tag1");  
        // インジケーターの設定  
        tab1.setIndicator("tab1");  
        // Tab にコンテンツを設定  
        tab1.setContent(R.id.content1);  
        // TabHost に Tab を追加  
        tabHost.addTab(tab1);  

        /********** Tab その2 **********/  
        // TabSpec の作成  
        TabSpec tab2 = tabHost.newTabSpec("tag2");  
        // インジケーターの設定  
        tab2.setIndicator("tab2");  
        // Tab にActivityを設定  
        tab2.setContent(new Intent(this, NestTabActivity.class));  
        // TabHost に Tab を追加  
        tabHost.addTab(tab2);  

    }

 @Override
 public void onTabChanged(String tabId) {
  
 }
}

ネストするタブ
import android.app.Activity;
import android.app.TabActivity;
import android.os.Bundle;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabHost.TabSpec;

public class NestTabActivity extends TabActivity implements OnTabChangeListener{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nesttab);
        
        TabHost tabHost = getTabHost();  
        // Tab が切り替わったときに呼ばれるコールバックを登録  
        tabHost.setOnTabChangedListener(this);  
      
        /********** Tab その1 **********/  
        // TabSpec の作成  
        TabSpec tab1 = tabHost.newTabSpec("tag1");  
        // インジケーターの設定  
        tab1.setIndicator("tab1");  
        // Tab のコンテンツの設定  
        tab1.setContent(R.id.content2);  
        // TabHost に Tab を追加  
        tabHost.addTab(tab1);  

        /********** Tab その2 **********/  
        // TabSpec の作成  
        TabSpec tab2 = tabHost.newTabSpec("tag2");  
        // インジケーターの設定  
        tab2.setIndicator("tab2");  
        // Tab のコンテンツの設定  
        tab2.setContent(R.id.content3);  
        // TabHost に Tab を追加  
        tabHost.addTab(tab2);  

    }

 @Override
 public void onTabChanged(String tabId) {
  
 }
}

これでオッケー。

もちろんActivityなのでAndroidManifest.xmlでActivityの指定が必要。
# だいたい最初入れ忘れて例外吐くw

AndroidManifest.xml


    

    
        
            
                
                
            
        
        

    


できたのはこんな感じ。


だいぶ素っ気ないので、レイアウトは変更しましょう。タブとか背景とか。
実際のアプリではこんな感じで使いました。


メインのタブはアイコン付き、ネストしたタブは文字だけにするとまとまりが良いかもしれません。

0 件のコメント:

コメントを投稿