1. 程式人生 > >Android中Activity巢狀 Fragment的正確姿勢

Android中Activity巢狀 Fragment的正確姿勢

使用 Activity + Fragment 代替直接使用 Activity ,網上這方面的講解不計其數,這不是今天我這篇博文要講的。

當今的 Android 開發模式架構,早已是 MVP 時代,不再使用 MVC 這種容易發生低耦合的架構。

我們在日常開發的時候,正確的姿勢應該是 Fragment 去實現 View 層裡面的方法,而不是直接在 Activity 裡面去實現 View 層的方法。

當然我今天的博文也不會涉及到 MVP 架構模式,就是教同學們如何正確的在 Activity 裡面巢狀 Fragment 。

程式碼示例:

Fragment

public class MainFragment extends
Fragment
{ /** * Fragment 的建構函式。 */ public MainFragment() { } public static MainFragment newInstance() { return new MainFragment(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{ View view = inflater.inflate(R.layout.fragment_main, container, false); initViews(view); return view; } /** * 初始化 Views * * @param view Fragment 對應的佈局控制元件。 */ private void initViews(View view) { // TODO: Init views. } }

Activity

接下來看我是如何寫 Activity 的。

佈局檔案:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" />

類檔案:

public class MainActivity extends AppCompatActivity {

    private MainFragment mMainFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState != null) {
            mMainFragment = (MainFragment) getSupportFragmentManager()
                    .getFragment(savedInstanceState, "MainFragment");
        } else {
            mMainFragment = MainFragment.newInstance();
        }

        getSupportFragmentManager().beginTransaction()
                .replace(R.id.main, mMainFragment)
                .commit();

    }

    /**
     * 當活動被回收時,儲存當前的狀態。
     *
     * @param outState 狀態資料。
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        // 儲存 Fragment 的狀態。
        getSupportFragmentManager().putFragment(outState, "MainFragment", mMainFragment);
    }
}

這樣用正確的姿勢在 Activity 裡面巢狀 Fragment 就完成了。