2011-01-13 11 views
0

Ich habe ein Projekt, in dem ich versuche, einige meiner vorhandenen TabHosts Refactoring. Ich habe eine Reihe sehr einfacher TabHost-Dateien, die wie die folgende Klasse aussehen. Einige haben nur einen Tab, einige 3, usw. - der einzige wirkliche Unterschied in ihnen ist die Anzahl der Tabs und die Aktivitätsklasse, die in jedem geladen ist. Ich möchte nur einen einzelnen TabHost erstellen, der die Informationen aus einem übergebenen Bundle abruft, um zu bestimmen, wie viele Tabs und die benötigten Informationen (Spezifikation, Indikator, Inhalt) zum Erstellen/Hinzufügen jedes Tabs benötigt werden. Es scheint, als ob die Elemente, die ich in das Bundle legen kann, ziemlich einfach sind und ich die Parcelable- oder Serializable-Funktionen nicht kenne. Irgendwelche Vorschläge?Android - Erstellen einer generischen TabHost, Übergabe von Informationen mit Bundle-Problem

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 

Antwort

0

Sieht so aus, als hätte ich diese Frage zu früh gestellt. Am Ende habe ich mein Problem mit einer Implementierung der Serializable-Klasse gelöst. Hoffentlich findet jemand anderes das nützlich. Sehen Sie den Code unten:

Zuerst erstellte Klasse die Daten

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 

dann die generische Tab Host-

aktualisiert halten
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 

Der Benutzer dieser Klasse verwenden können, es mag:

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);