[Android] Activity と Fragment の画面遷移

FragmentをActivityからコードで設定してHello Worldを表示させてみましたが、ActivityからFragment画面への切り替えをしてみましょう。
 
activity fragment 01 - [Android] Activity と Fragment の画面遷移

Android Studio 3.1.2
Android 8.1.0

 



ActivityからFragmentに画面遷移

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

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

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

 

任意のタイミングで起動

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

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

 
Activity:

 

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

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

All subclasses of Fragment must include a public no-argument constructor. The framework will often re-instantiate a fragment class when needed, in particular during state restore, and needs to be able to find this constructor to instantiate it. If the no-argument constructor is not available, a runtime exception will occur in some cases during state restore.

Ref: Fragment
 
要約すると、
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に戻る
まとめてみます。
 
MainActivity.java

 
TestFragment.java

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

 
fragment_main.xml

 
strings.xml

 

サンプル動画

 

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

 
References:
フラグメント | Android Developers
FragmentTransaction

誤字脱字、意味不明で分からにゃイ、
などのご意見はこちらから mailフォーム

ブックマークしておくと便利です このエントリーをはてなブックマークに追加


 


ページのトップへ戻る




シェアする

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

フォローする