[Android] Activity と Fragment の画面遷移

FragmentをActivityからコードで設定してHello Worldを表示させてみましたが、今度はActivityからFragment画面への切り替えをしてみましょう。いわゆる画面遷移ですが、Activity間の移動ではないので重くありません。

Android Studio
2021.2.1




ActivityからFragmentに画面遷移

 
Fragmentが現実的に使われるケースを想定して、

  1. 任意のタイミングで起動
  2. パラメータを渡してインスタンス生成
  3. Activityに戻る

という観点を考えてみます。
 

 

任意のタイミングで起動

 
これはButtonを使って任意のタイミングでFragmentを起動できます。
 
ActivityにボタンタップでFragmentのインスタンス生成を行います。これは前回のコードで記述したFragmentの張り付け部分を使います。
 

cat62 00 100x100 - [Android] Activity と Fragment の画面遷移
FragmentはActivityと共に重要な機能を果たしていますが、いまいちわかりにくところがあります。最初に簡単なHello W...

 
Activity:

 

パラメータを渡してインスタンス生成

 
Fragmentの場合コンストラクタの引数で渡したり、setterから取り出したりすると問題があります。

Fragmentは引数のないコンストラクタが必要で、フレームワークは必要に応じFragmentを再インスタンス化することが多く、引数のないコンストラクタが利用できなと例外が発生してしまいます。

引数を前提としてインスタンスを生成させていると、システムからFragmentの再生成されるときにクラッシュするかもしれないわけです。
 
解決方法としては、
静的な newInstance()を使ってフラグメントをインスタンス化する
これがベストプラクティスと言われています。
 
Activity:


 
newでインスタンス生成して、Bundleに設定したいパラメータをsetArguments()で追加します。
Fragment:


 
Bundleから getArguments() で取り出す

 

Activityに戻る

 
ButtonでFragmentが張り付けを行い、Activityに戻りたい場合にバックスタックを使います。
 


 
これをトランザクションに設定すると、トランザクションの開始時のFragment状態がスタックに積まれまれて、戻るボタンで前の状態に戻ることが可能になります。

 

サンプルコード


 
ActivityにFragmentに画面遷移、”Fragment”の文字列をTextViewに表示させる。(実際はactvity_mainにあるcontainerにFragmentを張り付け)
BackボタンでFragmentからActivityに戻る
まとめてみます。

1x1.trans - [Android] Activity と Fragment の画面遷移


 
MainActivity.java


 
SampleFragment .java


 
onViewCreated() はonCreateView()のViewを作成の直後に呼ばれます。ですからonCreateView()に入れ込んでいる記述も多く見かけます。
 
activity_main.xml


 
fragment_main.xml


 
strings.xml

 

サンプル動画

 

 
Fragmentはactivity_mainのcontainerに張り付けているためButtonが残ってしまいますが、containerを画面一杯にするようにレイアウトすればこれを避けることができます。
 
 
関連ページ:

 
References:
androidx.fragment.app | Android Developers
FragmentTransaction
フラグメント | Android Developers

シェアする

  • このエントリーをはてなブックマークに追加

フォローする