Fragment - ロジックを含めた画面部品の再利用 - Android


Fragmentとは

  • アクティブティの共通化および部品化。場合によってはサブアクティビティと捉えることも可能。再利用可能なモジュール。
  • 必ずアクティビティに属し、そのライフサイクルの影響を受ける。 UIを持つ場合もあれば、持たない場合もある。

Fragmentの使用方法

レイアウトファイルに直に書き込む方法もあるみたいだけど、自分は使わない気がしたので動的追加方法のみ説明。以下2ステップ。

  1. fragmentファイルを作成
  2. activityファイル上でコードを書いてfragmentを追加。コード例は以下。
  1. FragmentManagerfragmentManager=getFragmentManager();
  2. FragmentTransactiontransaction=fragmentManager.beginTransaction();
  3. Fragmentfragment=newMainFragment();
  4. transaction.add(R.id.fragment_container,fragment);
  5. transaction.commit();

関数はadd以外にもreplaceやremove、hide、showなどもあるみたい。


FragmentでDIするためにfragmentargsを使う

fragmentargsを使うと便利らしい。
GitHub - sockeqwe/fragmentargs: Annotation Processor for setting arguments in android fragments https://github.com/sockeqwe/fragmentargs

fragmentargsの準備

builde.gradle(app)のdependenciesブラケット内に下記二行追加。

  1. dependencies{
  2. compile'com.hannesdorfmann.fragmentargs:annotation:3.0.2'
  3. annotationProcessor'com.hannesdorfmann.fragmentargs:processor:3.0.2'
  4. }

builde.gradle(MyApplication)のallprojectsブラケット内に下記一行追加。

  1. allprojects{
  2. repositories{
  3. jcenter()
  4. maven{url"https://oss.sonatype.org/content/repositories/snapshots/"}
  5. }
  6. }

fragmentargsの使い方

fragmentファイル
アノテーション加筆。
変数宣言。
onCreateに以下一行加筆でインジェクション。

  1. @FragmentWithArgs //1
  2. public class MainFragment extends Fragment {
  3. @Arg //2
  4. String msg1;
  5. @Arg //2
  6. String msg2;
  7. @Override
  8. public void onCreate(Bundle savedInstanceState){
  9. super.onCreate(savedInstanceState);
  10. FragmentArgs.inject(this); //3
  11. }
  12. }

activityファイル
fragment処理を以下二行加筆。

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. Fragment f = new MainFragmentBuilder("hoge1.","hoge2").build(); //1
  5. getFragmentManager().beginTransaction().replace(R.id.fragment_container, f).commit(); //1
  6. }

fragmentファイル内の変数の宣言順とMainFragmentBuilderの引数の順番とは関連するので注意。上記例だとhoge1がmsg1に対応、hoge2がmsg2に対応。

fragment内のviewへの値設定方法
onCreate()→onCreateView()→onViewCreated()の順にコード実行されるので、onViewCreatedに記述する。

  1. @Override
  2. public void onViewCreated(View view, Bundle savedInstanceState) {
  3. super.onViewCreated(view, savedInstanceState);
  4. TextView textView = (TextView)view.findViewById(R.id.textView3);
  5. textView.setText(msg01);
  6. }

Fragmentにインスタンスを渡す fragmentargsとparcelerの連携

プリミティブな値ならfragmentargsで値渡し可能だが、インスタンスになるとparcelという概念が必要。serializableのAndroid特化版がparcelableで、シリアライズより高速。
下記ライブラリを利用。
GitHub - johncarl81/parceler: Android Parcelables made easy through code generation. https://github.com/johncarl81/parceler

parcelerの準備

builde.gradle(app)のdependenciesブラケット内に下記三行追加。
一番上の行はparcelerとfragmentargsとを連携するために必要。

  1. dependencies {
  2. compile'com.hannesdorfmann.fragmentargs:bundler-parceler:3.0.2'
  3. compile 'org.parceler:parceler-api:1.1.9'
  4. annotationProcessor 'org.parceler:parceler:1.1.9'
  5. }

parcelerの使い方

classファイル
クラスにアノテーション加筆。

  1. @Parcel
  2. public class User {
  3. }

fragmentファイル
変数にアノテーション加筆。

  1. @FragmentWithArgs
  2. public class MainFragment extends Fragment{
  3. @Arg( bundler = ParcelerArgsBundler.class )
  4. User user;
  5. }

activityファイル
ビルダーにて設定。

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. MainFragment mainFragment = new MainFragmentBuilder(new User(15,"名前")).build();
  4. }

Written with StackEdit.

コメント

このブログの人気の投稿

ロワシーバスでオペラまで行った後、タクシー乗るのはここがお勧め!

おすすめのシステム手帳!ダヴィンチのロロマクラシックは高品質!!

日本語と中国語の両方を上手く表示できるフォント探し