Fragmentを勉強する - part1

今回はAndroid 3.0で追加されたFragmentに関してです。
2回位に分けてここの要点をまとめたいと思います。

Fragment

    • 複数のFragmentを一つのActivity内で表示する事が出来る
    • 複数のActivityでFragmentを共有する事が出来る
    • FragmentのLifecycleはActivityのLifecycleに影響される
    • FragmentのTransactionはStackに保存されBack keyで戻ることが出来る
    • FragmentはActivityで使用されるViewGroupに組み込まれる
    • xmlで定義する際は要素として定義する
    • fragmentをUI上に表示する必要はない(Backgroundで作業をさせる)

Fragment Design Philosophy

複数のScreen sizeでそれぞれ適したUIを
Fragment example

Creating a Fragment

    1. Activityと同じようなLife cycle。少なくとも下記のcallback methodを実装する必要がある
      • onCreate()
      • onCreateView()
        • 初めてUIをdrawする際に呼ばれる。fragmentのrootとなるViewを返す必要がある。UIを持たない場合はViewを返す必要がない
      • onPause
    2. Fragmentのsub class
      • DiaglogFragment
      • ListFragment
      • PreferenceFragment

Life cycle

Adding a user interface

UIにFragmentを追加するにはonCreateView()でActivityのlayout(ViewGroup)に追加されるViewを返す

public static class ExampleFragment extends Fragment {
    //第2引数のViewGroupにreturnするViewが追加される
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // 第3引数のbooleanは"container"にreturnするViewを追加するかどうか
    //trueにすると最終的なlayoutに再度、同じView groupが表示されてしまうのでfalseでOKらしい
        return inflater.inflate(R.layout.example_fragment, container, false);
    }
}

Adding a fragment to an Activity

ActivityにFragmentを追加する

1. Activityのlayout xmlに定義

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment android:name="com.example.news.ArticleListFragment"
            android:id="@+id/list"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
    <fragment android:name="com.example.news.ArticleReaderFragment"
            android:id="@+id/viewer"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
</LinearLayout>

FragmentにはSystemやProgrammerが識別する為のidもしくはtagが必要である

    • android:idで特定のIDを提供
    • android:tagで特定のstringを提供
    • もし、上記二つがどっちも定義されていなければSystemは親ViewのIDを使用する

2. Source内で追加

FragmentTransaction objectを取得

FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

FragmentTransaction#add()でfragmentをActivityのViewGroupに追加

//Fragmentをinstance化
ExampleFragment fragment = new ExampleFragment();
//FragmentTransaction#add()で第1引数のlayoutにfragmentを追加
fragmentTransaction.add(R.id.fragment_container, fragment);
//変更をcommit
fragmentTransaction.commit();

Adding a Fragment without a UI

    • FragmentTransaction#add(Fragment, String)でFragmentを追加
    • UIを持たないのでonCreateView()を実装する必要がない
    • FragmentManager#findFragmentByTag()でFragmentを取得する(tagを定義しないとUIを持たないFragmentを取得する方法がなくなる)

1回目はまずはここまで。

HashTag #Android, #Fragment, #FragmentManager, #FragmentTransaction, #Activity