使い方をまとめました。こちらの記事は考察なども含まれてるので、簡潔に分かりたい場合はこちらを参照してください
Fragmentの紹介してるブログや記事、分かりにくいのが多すぎる気がする。
というのも、android2.3とかではsupportLibraryを使う必要があったけど、android4以降では必要なかったりして、何が正解なのか分からないのと目的もわからず、作ってるのが多いので、なので、今回は目的を明確にします。
・Activityのページ遷移をfragmentで実装してしまう。
という事を目的にします。タブレットの表示と、スマホの表示を分けたいとかの人は、今回はちょっと違います。
また、最初からfragmentを配置などもできるようですが、それも別の機会で考えます。
メインのxml
<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/frag" tools:context="com.example.fragmenttest.MainActivity" > </FrameLayout>
として、Activityは継承はActivityで大丈夫です
一方で、fragmentクラスを作ります。
public class Fragment1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { return inflater.inflate(R.layout.frag1, container,false); } }
として、レイアウトファイルは簡単に
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#666666" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1" /> </LinearLayout>
とします。
そしてメインのActivityのOnCreateに
FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); Fragment1 frag1 = new Fragment1(); fragmentTransaction.replace(R.id.frag, frag1); fragmentTransaction.commit();
とかけば、fragmentが表示されます
R.id.frag
は割となんでもいいようで、最初間違えて、fragmentを指定していたのですがfragmentの中にfragmentが入ってしまって、いたので注意ポイントです。
で、例えば、タイマー設定とかして※Fragment2っていう、ほぼ同じfragmentを作成
FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); Fragment2 frag2 = new Fragment2(); fragmentTransaction.replace(R.id.frag, frag2); fragmentTransaction.commit();
とするとfragmentを上書きしてくれます。fragment1ではonDestoryなども呼ばれます
fragmentTransaction.add()
っていうのを使っているサンプルも多いのですが、これは上に乗せる形になるので、できればメモリ的に避けたいです。replaceを推奨です
で、fragmentを終了させるには
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.remove(fragmentManager.findFragmentById(R.id.frag)); fragmentTransaction.commit();
こんな感じで、fragmentの差し替えを行う事をできました。