2011-01-13 4 views
0

기존 TabHosts의 리팩터링을 수행하려고하는 프로젝트가 있습니다. 아래 클래스처럼 보이는 아주 간단한 TabHost 파일이 있습니다. 일부는 실제로는 하나의 탭, 일부 3 개 등이 있습니다. 따라서 실제로 유일한 차이점은 탭의 수와 각 탭에로드 된 활동 클래스입니다. 나는 얼마나 많은 탭과 필요한 정보 (spec, indicator, content)를 결정하기 위해 번들로 전달 된 정보를 얻을 수있는 단일 TabHost를 작성하여 각 탭을 추가/추가하려고합니다. 번들에 넣을 수있는 항목이 꽤 기본적이고 Parcelable 또는 Serializable 기능에 익숙하지 않은 것 같습니다. 어떤 제안?Android - 번들 문제를 사용하여 정보를 전달하는 일반 TabHost 만들기

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 

답변

0

나는이 질문에 너무 빨리 뛰어 들었다. 직렬화 가능 클래스 구현을 사용하여 문제점을 해결했습니다. Hopefuly 누군가 다른 사람이 유용하다고 생각합니다.

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

먼저 생성 된 클래스

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 

그런 다음이 클래스의 사용자가 원하는 사용할 수 있습니다

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 

일반 탭 호스트에게 업데이트 된 데이터를 보유하기 : 아래 코드 참조

관련 문제