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=" http://schemas.android.com/apk/res/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=" http://schemas.android.com/apk/res/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 的檔案,補上新連結。範例檔下載。