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 //1
public class MainFragment extends Fragment {
@Arg //2
String msg1;
@Arg //2
String msg2;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
FragmentArgs.inject(this); //3
}
}
activityファイル
fragment処理を以下二行加筆。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Fragment f = new MainFragmentBuilder("hoge1.","hoge2").build(); //1
getFragmentManager().beginTransaction().replace(R.id.fragment_container, f).commit(); //1
}
fragmentファイル内の変数の宣言順とMainFragmentBuilderの引数の順番とは関連するので注意。上記例だとhoge1がmsg1に対応、hoge2がmsg2に対応。
fragment内のviewへの値設定方法
onCreate()→onCreateView()→onViewCreated()の順にコード実行されるので、onViewCreatedに記述する。
@Override
public 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ファイル
クラスにアノテーション加筆。
@Parcel
public class User {
…
}
fragmentファイル
変数にアノテーション加筆。
@FragmentWithArgs
public class MainFragment extends Fragment{
@Arg( bundler = ParcelerArgsBundler.class )
User user;
…
}
activityファイル
ビルダーにて設定。
@Override
protected void onCreate(Bundle savedInstanceState) {
MainFragment mainFragment = new MainFragmentBuilder(new User(15,"名前")).build();
}
Written with StackEdit.
コメント
コメントを投稿