顯示具有 Fragment 標籤的文章。 顯示所有文章
顯示具有 Fragment 標籤的文章。 顯示所有文章

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

Fragment切換起手式

在Android版本3.0之後發行了Fragment這個新功能
從此之後就不用每次要開新的畫面就得launch新的Activity啦!
這個新功能可以做到同一個Activity內多個畫面的切換
同時又不影響整個Activity的生命週期(同場加映Fragment與Activity互相對應的生命週期)
以下將展示Fragment切換起手式

首先你會準備幾個檔案:
  1. 執行以下代碼的Activity(這邊以MainActivity.class為例) 
  2. 欲更換的Fragment(這邊以FragmentNearby.class為例) 
  3. 整個畫面的layout(這邊以main.xml為例,在欲更換Fragment的地方放置Framelayout元件,且在本例中該元件id為content)
Fragment切換起手式
// new一個新的Fragment類別物件
FragmentNearby fragmentNearby = new FragmentNearby();

// getFragmentManager, 這邊getSupportFragmentManager是為了向較舊的版本相容
FragmentManager fragmentManager = getSupportFragmentManager();

// 進行transaction
FragmentTransaction transaction = fragmentManager.beginTransaction();

// 對Fragment動手動腳,指令額外包括add, remove, hide, show...etc
transaction.replace(R.id.content, fragmentNearby);

// 確認並執行transaction!
transaction.commit();



References


Fragments | Android Developers