LoginSignup
1
1

More than 3 years have passed since last update.

いまさらFragmentを試してみる

Posted at

はじめに

Androidのプログラムを初めて何年も経つけどFragmentを触ったことがほとんどないというちょっと恥ずかしいかもしれない告白w
まぁ、SurfaceViewに描画してゲーム作る程度なのでFragment無くてもよかったというのもあるけど。
最近、お仕事でもAndroidのコードに触れる機会もあり、そろそろちゃんと分かっておかないと、やばい!
というわけで、ネットで何かないかな?と探してたらあったので試してみる。

参考にしたのはこちら
Android はじめてのFragment

いや、ほんと初めてみたいなものなのでw
上記のページを参考にしたところ、LegacyになってるRelativeLayoutを使てたり、知識の足りないせいで思うようにいかないところがあったりと、久々にAndroidのコード書いてよいウォーミングアップになりました。

とりあえず、参考サイトの内容をなぞるように書くなら、参考サイトを見てもらえばいいので、個人的に調べたことを追加しつつ、適当に端折りながら書いていきます(自分が後で参考にできればいいくらいの気持ちで)

Androidのプロジェクトの作成

Empty Activityでプロジェクトを作ります。
image.png

今のトレンドならKotlinがいいと思いますが、Javaを選んでやりました。
image.png

Fragmentのレイアウトとクラスの作成

こんな感じでレイアウトを作成します
image.png

で、作ったレイアウトを開いて、TextViewとButtonを追加します。
あと、LinerLayoutのlayout_widthをmatch_parent、layout_heightをwarp_contentにします。
こんな感じになっていればOK
image.png

次にFragmentを実装したクラスを作成します。
image.png

クラスができたら、onCreateView()メソッドとonViewCreated()メソッドをオーバーライドして、中身を実装します。
参考元そのまんまですが、

MainFragment.java
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のコードはこんな感じ。

MainActivity.java
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を追加することができました。
image.png

さてさて、今回はここまで。
もう少し、Fragmentを使うシーンを考えて実装したいところ。
何か考えよう。

参考

Android はじめてのFragment
Fragmentの初期化はonViewCreatedかonActivityCreatedで
知らずに作って大丈夫?Androidの基本的なライフサイクルイベント31選

1
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1