MainTabActivity.java : 主要的Tabhost Activity。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | publicclassMainTabActivityextendsActivity { privateTabHost mHost; // 在Activity中使用Tabhost必須要有LocalActivityManager物件來設定 LocalActivityManager lam; @Override publicvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // main layout採用預設的Tabhost mHost = (TabHost) findViewById(android.R.id.tabhost); lam =newLocalActivityManager(MainTabActivity.this,false); lam.dispatchCreate(savedInstanceState); mHost.setup(lam); mHost.addTab(mHost.newTabSpec("Tab1").setIndicator("Tab1").setContent(newIntent(MainTabActivity.this, FragmentActivity1.class))); mHost.addTab(mHost.newTabSpec("Tab2").setIndicator("Tab2").setContent(newIntent(MainTabActivity.this, FragmentActivity2.class))); } @Override protectedvoidonPause() { // 漏掉這行一定出錯 lam.dispatchPause(isFinishing()); super.onPause(); } @Override protectedvoidonResume() { // 漏掉這行一定出錯 lam.dispatchResume(); super.onResume(); } } |
FragmentActivity1.java : 第一個Tab中用來管理Fragment的FragmentActivity。(2012-05-07更新)經詳細測了一下,發現FragmentActivity主畫面中的Button是沒辦法消失的(因為FragmentActivity的目的關係),因此改成這樣,讓FragmentActivity純粹當成容器,主要的內容還是以Fragment為主。(這個方法不是唯一,但是一個可行的方法,應該也有更好的做法!)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | publicclassFragmentActivity1extendsFragmentActivity { publicstaticFragmentManager fm; @Override publicvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_activity_1); fm = getSupportFragmentManager(); // 只當容器,主要內容已Fragment呈現 initFragment(newFragment1()); } // 切換Fragment publicstaticvoidchangeFragment(Fragment f){ changeFragment(f,false); } // 初始化Fragment(FragmentActivity中呼叫) publicstaticvoidinitFragment(Fragment f){ changeFragment(f,true); } privatestaticvoidchangeFragment(Fragment f,booleaninit){ FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.simple_fragment, f); if(!init) ft.addToBackStack(null); ft.commit(); } } |
Fragment1.java : 真正使用到的Fragment。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | publicclassFragment1extendsFragment { @Override publicView onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_1, container,false); Button tv = (Button)v.findViewById(R.id.button2); tv.setOnClickListener(newView.OnClickListener() { @Override publicvoidonClick(View v) { // 直接呼叫FragmentActivity1的靜態方法來做切換 FragmentActivity1.changeFragment(newFragment2()); } }); returnv; } } |
fragment_acitivity_1.xml : FragmentActivity layout。(2012-05-07修改) FragmentActivity只用來當容器,而不真正呈現內容(僅把Fragment內容載入)。
1 2 3 4 5 6 7 | <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android=" " android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/simple_fragment"> </LinearLayout> |
fragment1.xml:Fragment layout,FragmentActivity載入的真正內容。
1 2 3 4 5 6 7 8 9 10 11 | <?xml version="1.0"encoding="utf-8"?> <LinearLayout xmlns:android=" " android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button"/> </LinearLayout> |
最後別忘了在AndroidManifest.xml中加入android:configChanges=”orientation”設定。這樣就成功的使用在Activity中使用Tabhost並且透過FragmentActivity來管理Fragment囉!
2013-01-30 許多網友反應無法下載 MediaFire 的檔案,補上新連結。。