Fragment切換,另一種方法

在之前的文章「Fragment切換起手式」中我已經介紹了最基本的方法,就是透過Framelayout作為container
然後使用FragmentTransaction的方式來更換Fragment
其實還存在另外一種方法,這邊我將使用Facebook的一個開放原始碼project來示範

main.xml
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

    <fragment android:name="com.facebook.scrumptious.SelectionFragment"
              android:id="@+id/selectionFragment"
              android:layout_width="match_parent"
              android:layout_height="match_parent" />

    <fragment android:name="com.facebook.scrumptious.SplashFragment"
              android:id="@+id/splashFragment"
              android:layout_width="match_parent"
              android:layout_height="match_parent" />

    <fragment android:name="com.facebook.widget.UserSettingsFragment"
              android:id="@+id/userSettingsFragment"
              android:layout_width="match_parent"
              android:layout_height="match_parent" />

</LinearLayout>
一開始先將所有Fragment的layout都放置在主要Activity的layout中
接著透過hide與show的方式控制Fragment出現的時機

MainActivity.class
        FragmentManager fm = getSupportFragmentManager();
        SplashFragment splashFragment = (SplashFragment) fm.findFragmentById(R.id.splashFragment);

        // fragments[畫面名稱]是個用來存放相關畫面的Class類別陣列
        // 如SPLASH、SELECTION、SETTINGS分別代表登入頁、主選單與設置頁
        fragments[SPLASH] = splashFragment;
        fragments[SELECTION] = fm.findFragmentById(R.id.selectionFragment);
        fragments[SETTINGS] = fm.findFragmentById(R.id.userSettingsFragment);

        FragmentTransaction transaction = fm.beginTransaction();
        for(int i = 0; i < fragments.length; i++) {
            transaction.hide(fragments[i]);

        }
        transaction.commit();
...
private void showFragment(int fragmentIndex, boolean addToBackStack) {
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction transaction = fm.beginTransaction();

        //將不需要的頁面隱藏,只顯示想展示的頁面
        for (int i = 0; i < fragments.length; i++) {
            if (i == fragmentIndex) {
                transaction.show(fragments[i]);
            } else {
                transaction.hide(fragments[i]);
            }
        }
        if (addToBackStack) {
            transaction.addToBackStack(null);
        }
        transaction.commit();
    }

這種方式也是切換Fragment的一種方式,他同樣不會影響Activity的生命週期
不過有趣的一點是──在Activity執行生命週期的時候
所有的Fragment也會同時執行生命週期XDDDD
也就是說,若你有寫一些code,想要讓使用者載入該Fragment的時候自動執行
使用這個方法的結果就是──它同時載入了所有Fragment的code,並且同時執行
由於Facebook的這個project我認為它每個主要的Fragment其實沒有什麼太特殊的功能
不然的話我想使用這個方法必須經過再三考慮

References


facebook-android-sdk/samples/Scrumptious at master · facebook/facebook-android-sdk

沒有留言:

張貼留言