2011-01-13 2 views
0

J'ai un projet dans lequel j'essaie de faire un refactoring de mes TabHosts existants. J'ai un tas de fichiers TabHost très simples qui ressemblent à la classe ci-dessous. Certains n'ont en réalité qu'une seule tabulation, d'autres 3, etc. - la seule vraie différence est le nombre d'onglets et la classe d'activité chargée dans chacun d'entre eux. Je voudrais juste créer un TabHost unique qui pourrait extraire l'information d'un Bundle réussi pour déterminer le nombre d'onglets et l'information nécessaire (spec, indicateur, contenu) pour construire/ajouter chaque onglet. Il semble que les éléments que je peux placer dans le paquet sont assez basiques et je ne suis pas familier avec les fonctionnalités Parcelable ou Serializable. Aucune suggestion?Android - création d'un TabHost générique, transmission d'informations à l'aide d'un problème Bundle

public class SomeTabHost 
     extends ActivityGroup 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     // Inflate ourselves into the layout ViewStub 
     ViewStub vs = (ViewStub) findViewById(R.id.theViewStub); 
     vs.setLayoutResource(R.layout.my_tabhost); 
     vs.inflate(); 

     TabHost host = (TabHost) findViewById(android.R.id.tabhost); 
     host.setup(getLocalActivityManager()); 

     host.addTab(host.newTabSpec("Tab1") 
         .setIndicator("Tab1") 
         .setContent(new Intent(this, SomeActivity.class))); 

     host.addTab(host.newTabSpec("Tab2") 
         .setIndicator("Tab2") 
         .setContent(new Intent(this, SomeOtherActivity.class))); 

     int numChildren = host.getTabWidget().getChildCount(); 
     for (int i=0; i <numChildren; i++) 
     { 
     host.getTabWidget().getChildAt(i).getLayoutParams().height = 35; 
     } 
    }// end onCreate 
}// end class 

Répondre

0

On dirait que j'ai sauté en posant cette question trop tôt. J'ai fini par résoudre mon problème en utilisant une implémentation de classe Serializable. Espérons que quelqu'un d'autre trouve cela utile. Voir le code ci-dessous:

première classe créée pour contenir les données

public class TabDetails implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    public String tabSpec  = ""; 
    public String tabIndicator = ""; 
    public Class<?> tabContent = null; 

    public TabDetails(String aTabSpec, 
         String aTabIndicator, 
         Class<?> aTabContent) 
    { 
     this.tabSpec  = aTabSpec; 
     this.tabIndicator = aTabIndicator; 
     this.tabContent = aTabContent; 
    } 
}//end class 

ensuite mis à jour l'onglet Generic Host

public class GenericTabHost extends ActivityGroup 
{ 
    public static final String TABS = "TABS"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    {   
     super.onCreate(savedInstanceState); 

     // Inflate ourselves into the layout ViewStub 
     ViewStub vs = (ViewStub) findViewById(R.id.theViewStub); 
     vs.setLayoutResource(R.layout.mc_tabhost); 
     vs.inflate();  

     TabHost host = (TabHost) findViewById(android.R.id.tabhost); 
     host.setup(getLocalActivityManager()); 

     Bundle bundle = this.getIntent().getExtras(); 

     if (null != bundle) 
     { 
     ArrayList<TabDetails> tabDetailsList = (ArrayList<TabDetails>) bundle.getSerializable(GenericTabHost.TABS); 

     for (TabDetails tabDetails : tabDetailsList) 
     { 
      host.addTab(host.newTabSpec (tabDetails.tabSpec ) 
          .setIndicator(tabDetails.tabIndicator) 
          .setContent (new Intent(getApplicationContext(), 
                 tabDetails.tabContent )); 
      } 

      int numChildren = host.getTabWidget().getChildCount(); 
      for (int i=0; i <numChildren; i++) 
      { 
       host.getTabWidget().getChildAt(i).getLayoutParams().height = 35; 
      } 
     } 
     } 
     else 
     { 
     Log.e("GenericTabHost", "#### This class must be passed in data to build itself ####"); 
     } 

    }// end onCreate 

}// end class 

L'utilisateur de cette classe peut l'utiliser comme:

ArrayList<TabDetails> tabDetailsArray = new ArrayList<TabDetails>(2); 
tabDetailsArray.add(new TabDetails("Tab_1", 
            "Tab 1", 
            SomeActivity.class)); 
tabDetailsArray.add(new TabDetails("Tab_2", 
            "Tab 2", 
            AnotherActivity.class)); 

Intent intent = new Intent(getApplicationContext(), GenericTabHost.class); 
intent.putExtra(GenericTabHost.TABS, tabDetailsArray); 
startActivity(intent);