ちょっと考えてみた18

フラグメントの概念は面白いが、使う方は扱いが難しい印象です。タブ付きの画面切り替えがこんなに難しいとは。

swingみたいに、タブペインをアクティビティに貼り付けるだけというわけにはいかないのでしょう。これは独り言です。

 

フラグメントを作る際も、レイアウトはXMLファイルに作成します。例えば、fragment_top.xmlなどとして、それに対応するJavaファイルとして、Fragmentを継承したTopFragment.javaを作成する方が最初は分かりやすくて良いでしょう。(フラグメントは、UIというViewと、ロジックというModelを記載できるということで、viewはレイアウトXMLできさいし、ModelはJavaファイルで書けば良いかなと思うからです。)このなかで、コンストラクタをオーバーライドして、引数ありののコンストラクタに変更してはだめなようです。

引数を取りながらインスタンス化したいときは、new演算子を使ってみずからのオブジェクト作成する記述をふくむnewInstance()を定義し、このメソッドに引数をいれるという遠回りのことをする必要があるようです。なお、このとき、newInstance( )メソッドには、staticをつけなければいけません。

このstaticというのは、まず、絶対に必要なときにつけるようにしなければなりません。Javaでは、もっとはじめの段階で悩まされるのですが(メインのコードをstaticのメソッド内に書いていくため)、Androidでは、メインのコードをstaticでないonCreate()に書くようになってるからです。

話を戻すと、staticがついてるものは、プログラミングを実行した時点で、メモリ上に実体化されるのです。それ以外のクラスは、あくまで設計図の認識はされますが、new演算子を使わないと、メモリ上に実体化されません。

使う際には、TopFragment.newInstance(引数)というふうにつかいます。このとき戻り値は、TopFragmentクラスのオブジェクトです。

newInsance()の引数は メインコードからフラグメントに値を送るために重要で、メソッドないで、引数で受け取った値を渡す処理まで記載してます。値送る必要なければ、当然引数はなくてもかまいません。

 

MainActivityから、FragmentManagerを呼びだし、実行役のTransactionで、どこに、どのフラグメントをいれるかを決めます。このとき、あらかじめ、レイアウトXMLの方で、場所を設定し、その場所の名前を登録しておきます。add()あるいはreplace()メソッドの引数に、場所名と入れたいフラグメントを入れてあげればよいわけです。この際、どのActivityというのは、問題になりません。そういうところが、Activityを縦の糸とすると、Fragmentは横の糸なのです。(あくまで一個人のイメージの話です)