Fragment - ロジックを含めた画面部品の再利用 - Android
Fragmentとは
- アクティブティの共通化および部品化。場合によってはサブアクティビティと捉えることも可能。再利用可能なモジュール。
- 必ずアクティビティに属し、そのライフサイクルの影響を受ける。 UIを持つ場合もあれば、持たない場合もある。
Fragmentの使用方法
レイアウトファイルに直に書き込む方法もあるみたいだけど、自分は使わない気がしたので動的追加方法のみ説明。以下2ステップ。
- fragmentファイルを作成
- activityファイル上でコードを書いてfragmentを追加。コード例は以下。
FragmentManagerfragmentManager=getFragmentManager();FragmentTransactiontransaction=fragmentManager.beginTransaction();Fragmentfragment=newMainFragment();transaction.add(R.id.fragment_container,fragment);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ブラケット内に下記二行追加。
dependencies{…compile'com.hannesdorfmann.fragmentargs:annotation:3.0.2'annotationProcessor'com.hannesdorfmann.fragmentargs:processor:3.0.2'}
builde.gradle(MyApplication)のallprojectsブラケット内に下記一行追加。
allprojects{repositories{jcenter()maven{url"https://oss.sonatype.org/content/repositories/snapshots/"}}}
fragmentargsの使い方
fragmentファイル
アノテーション加筆。
変数宣言。
onCreateに以下一行加筆でインジェクション。
@FragmentWithArgs //1public class MainFragment extends Fragment {@Arg //2String msg1;@Arg //2String msg2;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);FragmentArgs.inject(this); //3}}
activityファイル
fragment処理を以下二行加筆。
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Fragment f = new MainFragmentBuilder("hoge1.","hoge2").build(); //1getFragmentManager().beginTransaction().replace(R.id.fragment_container, f).commit(); //1}
fragmentファイル内の変数の宣言順とMainFragmentBuilderの引数の順番とは関連するので注意。上記例だとhoge1がmsg1に対応、hoge2がmsg2に対応。
fragment内のviewへの値設定方法
onCreate()→onCreateView()→onViewCreated()の順にコード実行されるので、onViewCreatedに記述する。
@Overridepublic void onViewCreated(View view, Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);TextView textView = (TextView)view.findViewById(R.id.textView3);textView.setText(msg01);}
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とを連携するために必要。
dependencies {…compile'com.hannesdorfmann.fragmentargs:bundler-parceler:3.0.2'compile 'org.parceler:parceler-api:1.1.9'annotationProcessor 'org.parceler:parceler:1.1.9'}
parcelerの使い方
classファイル
クラスにアノテーション加筆。
@Parcelpublic class User {…}
fragmentファイル
変数にアノテーション加筆。
@FragmentWithArgspublic class MainFragment extends Fragment{@Arg( bundler = ParcelerArgsBundler.class )User user;…}
activityファイル
ビルダーにて設定。
@Overrideprotected void onCreate(Bundle savedInstanceState) {MainFragment mainFragment = new MainFragmentBuilder(new User(15,"名前")).build();}
Written with StackEdit.
コメント
コメントを投稿