15 Dec 2017

Android Fragment 入門

一、前言簡介

Fragment 是 Android 3.0 (API 11) 推出的一個重大功能,主要功能可使 App 畫面在不同大小的螢幕上顯示時有不一樣的表現。以下圖為例,在小螢幕手機上所顯示的 A 畫面與 B 畫面是分開來的,但是在平板 (較大的螢幕) 上可使 A 畫面與 B 畫面同時顯示,如下圖所示,下圖取自 Android 官網。Fragment 的重要性在於更彈性的設計使用介面,而 Fragment 的使用需由嵌入 Activity。

二、Fragment 的基本使用方法

懂得如何靈活運用 Fragment 的步驟就是要知道如何在 Activity 中嵌入 Fragment。請各位讀者先建立好一個專案並依照下列步驟便可完成 Fragment 的基本使用。

  1. activity_main.xml

activity_main.xml 的佈局如下,FrameLayout 是作為 Fragment 畫面的容器,要記得為此 Layout 設 id。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/fragment_container"
    tools:context="com.little.testfragment.MainActivity">

</FrameLayout>
  1. fragment_content.xml

這個佈局畫面是讓使用者操作的 App 畫面,本範例只改了背景色。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_blue_bright">

</android.support.constraint.ConstraintLayout>
  1. ContentFragment.java

此類別繼承 Fragment 並且覆寫 onCreateView 方法來取得畫面。

package com.little.testfragment;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by sarah on 15/12/2017.
 */

public class ContentFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_content,container,false);
        return v;
    }
}
  1. MainActivity.java

完成下面的程式碼後就完成了 Fragment 的基本使用,程式碼中先用 FragmentManager 尋找 Fragment 是因為呼叫 onCreate 後所建立的 Fragment 會在 onDestroy 調用後被 FragmentManager 儲存起來,所以下一次呼叫 onCreate 時就直接從 FragmentManager 取得就可以了。

package com.little.testfragment;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

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

        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);

        if(fragment == null){
            fragment = new ContentFragment();
            fragmentManager.beginTransaction()
                    .add(R.id.fragment_container,fragment)
                    .commit();
        }

    }
}

執行結果

參考資料

Android 官方網站


Tags:
0 comments