Android Tabhost with FragmentActivity

来源:互联网 发布:js判断小于等于 编辑:程序博客网 时间:2024/05/08 01:35

接續Android TabHost中切換Activity記錄了使用ActivityGroup達到在TabHost中切換Activity的方法,也在Android Screen Orientation Event螢幕方向處理+Acitivity Liftcycle記錄了當螢幕方向改變時的處理,這篇小蛙繼續記錄用FragmentActivity取代ActivityGroup,透過FragmentActivity內建的BackStack來管理倒退歷程。

MainTabActivity.java : 主要的Tabhost Activity。

 

复制代码
public class MainTabActivity extends Activity {    private TabHost mHost;    // 在Activity中使用Tabhost必須要有LocalActivityManager物件來設定    LocalActivityManager lam;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        // main layout採用預設的Tabhost        mHost = (TabHost) findViewById(android.R.id.tabhost);         lam = new LocalActivityManager(MainTabActivity.this, false);        lam.dispatchCreate(savedInstanceState);         mHost.setup(lam);        mHost.addTab(mHost.newTabSpec("Tab1").setIndicator("Tab1").setContent(new Intent(MainTabActivity.this, FragmentActivity1.class)));        mHost.addTab(mHost.newTabSpec("Tab2").setIndicator("Tab2").setContent(new Intent(MainTabActivity.this, FragmentActivity2.class)));    }    @Override    protected void onPause() {        // 漏掉這行一定出錯        lam.dispatchPause(isFinishing());        super.onPause();    }    @Override    protected void onResume() {        // 漏掉這行一定出錯        lam.dispatchResume();        super.onResume();    }}
复制代码

FragmentActivity1.java : 第一個Tab中用來管理Fragment的FragmentActivity。(2012-05-07更新)經由Jay留言後,小蛙詳細測了一下,發現FragmentActivity主畫面中的Button是沒辦法消失的(因為FragmentActivity的目的關係),因此改成這樣,讓FragmentActivity純粹當成容器,主要的內容還是以Fragment為主。(這個方法不是唯一,但是一個可行的方法,應該也有更好的做法!)

复制代码
public class FragmentActivity1 extends FragmentActivity {    public static FragmentManager fm;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.fragment_activity_1);        fm = getSupportFragmentManager();        // 只當容器,主要內容已Fragment呈現        initFragment(new Fragment1());    }    // 切換Fragment    public static void changeFragment(Fragment f){        changeFragment(f, false);    }    // 初始化Fragment(FragmentActivity中呼叫)    public static void initFragment(Fragment f){        changeFragment(f, true);    }    private static void changeFragment(Fragment f, boolean init){        FragmentTransaction ft = fm.beginTransaction();        ft.replace(R.id.simple_fragment, f);        if(!init)            ft.addToBackStack(null);        ft.commit();    }}
复制代码

Fragment1.java : 真正使用到的Fragment。

复制代码
public class Fragment1 extends Fragment {    @Override    public View 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(new View.OnClickListener() {            @Override            public void onClick(View v) {                // 直接呼叫FragmentActivity1的靜態方法來做切換                FragmentActivity1.changeFragment(new Fragment2());            }        });        return v;    }}
复制代码

fragment_acitivity_1.xml : FragmentActivity layout。(2012-05-07修改) FragmentActivity只用來當容器,而不真正呈現內容(僅把Fragment內容載入)。

复制代码
<?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"    android:id="@+id/simple_fragment"></LinearLayout>
复制代码

fragment1.xml:Fragment layout,FragmentActivity載入的真正內容。

复制代码
<?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囉!


原创粉丝点击