はじめに
Androidのプログラムを初めて何年も経つけどFragmentを触ったことがほとんどないというちょっと恥ずかしいかもしれない告白w
まぁ、SurfaceViewに描画してゲーム作る程度なのでFragment無くてもよかったというのもあるけど。
最近、お仕事でもAndroidのコードに触れる機会もあり、そろそろちゃんと分かっておかないと、やばい!
というわけで、ネットで何かないかな?と探してたらあったので試してみる。
参考にしたのはこちら
Android はじめてのFragment
いや、ほんと初めてみたいなものなのでw
上記のページを参考にしたところ、LegacyになってるRelativeLayoutを使てたり、知識の足りないせいで思うようにいかないところがあったりと、久々にAndroidのコード書いてよいウォーミングアップになりました。
とりあえず、参考サイトの内容をなぞるように書くなら、参考サイトを見てもらえばいいので、個人的に調べたことを追加しつつ、適当に端折りながら書いていきます(自分が後で参考にできればいいくらいの気持ちで)
Androidのプロジェクトの作成
今のトレンドならKotlinがいいと思いますが、Javaを選んでやりました。
Fragmentのレイアウトとクラスの作成
で、作ったレイアウトを開いて、TextViewとButtonを追加します。
あと、LinerLayoutのlayout_widthをmatch_parent、layout_heightをwarp_contentにします。
こんな感じになっていればOK
クラスができたら、onCreateView()メソッドとonViewCreated()メソッドをオーバーライドして、中身を実装します。
参考元そのまんまですが、
public class MainFragment extends Fragment {
private TextView mTextView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInstanceState) {
super.onCreateView(inflater, container, saveInstanceState);
return inflater.inflate(R.layout.fragment_main, container, false);
}
@Override
public void onViewCreated(View view, Bundle saveInstanceState){
super.onViewCreated(view, saveInstanceState);
mTextView = view.findViewById(R.id.textView);
view.findViewById(R.id.button).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
mTextView.setText(mTextView.getText() + "!");
}
});
}
}
onCreateView()メソッドは、Fragmentが最初にUIを描画するときにシステムから呼び出されるメソッドになります。
なので、ここで、FragmentにViewを設定しています。
ちなみに、FragmentクラスのコンストラクタにリソースIDを指定したり、@ContentViewアノテーションで指定できるらしいのですが、今回試したSDKのバージョン(26)ではできなかった。
どこかでこの辺は調べて明確にしておきたいところ。
onViewCreated()メソッドは、公式のフラグメントのサイトのライフサイクルの図には登場しませんが、onCreateViewメソッドの後にシステムから呼び出されるメソッドです。
初期化処理はonCreateView()ではなくonViewCreated()でやってねと公式の(Fragmentのリファレンス)[https://developer.android.com/reference/kotlin/androidx/fragment/app/Fragment.html#oncreateview]に書いてあります。
なので、onViewCreated()メソッドで初期化処理を行っています。
ActivityにFragmentを追加する
レイアウトに追加してもいいんですが、コードで追加する方法が好みなので、コードでFragmentをActivityに追加します。
Activityのコードはこんな感じ。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MainFragment fragment1 = new MainFragment();
MainFragment fragment2 = new MainFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(R.id.container, fragment1);
transaction.add(R.id.container, fragment2);
transaction.commit();
}
}
同じフラグメントを追加したかったのでこんな感じになっています。
参考元だと、
transaction.add(R.id.container, fragment1);
上記をもう一度呼び出せばいいように読めますが、上記を2回呼び出すと、落ちます。
なので、MainFragmentクラスのインスタンスはそれぞれ作る必要があります。
これで、ActivityにFragmentを追加することができました。
さてさて、今回はここまで。
もう少し、Fragmentを使うシーンを考えて実装したいところ。
何か考えよう。
参考
Android はじめてのFragment
Fragmentの初期化はonViewCreatedかonActivityCreatedで
知らずに作って大丈夫?Androidの基本的なライフサイクルイベント31選