fragmentを使ってみよう
TRANSCRIPT
Support-v4 + Fragment
基本的な使い方?
目的
android-support-v4.jarを使って、 Fragment使った遷移(画面遷移)を学ぼう
Buttonをタップしたら次の画面に行って、端末の戻るボタンで戻ってくるだけのアプリを作ってみよう
Projectを作ろう
Eclipseで Android Application Projectを作るandroid-support-v4.jarは libsに勝手にはいる
Fragmentを置く場所
activity_main.xmlを書き換えて、 Fragmentを置く場所を作る
FragmentActivity
android-support-v4.jarを使う場合は、 FragmentActivityを使う
ページ (Fragment)を作る
最初のページ用 layout.xml(fragment_page_1.xml)を作る
Page1Fragmentを作る
Fragmentを継承した、 Page1Fragmentを作るpublic class Page1Fragment extends Fragment { public static Page1Fragment newInstance() { Page1Fragment fragment = new Page1Fragment();
return fragment; }
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.fragment_page_1, container, false); return root; }}
newInstance()
パラメータ付きで Fragmentのインスタンスを作りたいときに存在意義がでてくる引数付きコンストラクタは作れない
定番パターンの1つとして覚えておくといいかも?
onCreateView
Viewを作って返すためのメソッド
引数で渡される inflaterを使う場合は以下の呼び方のみinflater.inflate(R.layout.fragment_page_1, container, false);
container, false で呼ばないとアプリ落ちます( ´ ・ω ・`)
View.OnClickListenerとかもここでセットできるのならしてしまう
次の Fragmentを作る
Page2Fragmentを作る。レイアウトはおまかせpublic class Page2Fragment extends Fragment { public static Page2Fragment newInstance() { Page1Fragment fragment = new Page2Fragment();
return fragment; }
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.fragment_page_2, container, false); return root; }}
ボタン押したら画面遷移
こんな感じで replace()と commit()を呼べば OK
View button = root.findViewById(R.id.button1);button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); // 今の Fragmentを BackStackに名前をつけて入れる transaction.addToBackStack("page1"); transaction.replace(R.id.main, Page2Fragment.newInstance()); transaction.commit(); }});
あれ、最初は?
MainActivityの onCreate()で replace() + commit()getSupportFragmentManager()な点に注意
@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager manager = getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); // Go to Page 1 transaction.replace(R.id.main, Page1Fragment.newInstance()); transaction.commit();}