ジレンマ:フラグメントとアクティビティをいつ使用するか:

813
Emil Adz 2013-12-01 11:53.

私はそれActivitiesが私のアプリケーションの単一の画面を表すように設計されていることを知っていますが、Fragmentsそれらの中にロジックが埋め込まれた再利用可能なUIレイアウトになるように設計されています。

少し前まで、開発すべきだと言われていたアプリケーションを開発しました。Activityアプリケーションの画面を表すためにを作成し、ViewPagerまたはのフラグメントを使用しましたGoogle MapsListFragment何度も再利用できるUIやその他のUIを作成することはめったにありません。

最近、私は2Activitiesつだけを含むプロジェクトに出くわしました。1つはaでSettingsActivity、もう1つはMainActivityです。のレイアウトには、MainActivity多くの非表示のフルスクリーンUIフラグメントが表示され、1つだけが表示されます。Activity論理多く存在するFragmentTransitionsアプリケーションの異なる画面間。

このアプローチで私が気に入っているのは、アプリケーションがを使用しているため、アプリケーションActionBarがそのまま残り、画面切り替えアニメーションで移動しないことActivityです。これは、切り替えで発生します。これにより、これらの画面遷移がより流暢に感じられます。

ですから、私が求めているのは、このトピックに関する現在の開発方法を共有することだと思います。一見すると意見に基づく質問のように見えるかもしれませんが、Androidの設計とアーキテクチャの質問として見ています...実際には意見ベースのもの。

UPDATE(2014年1月5日):によってこのプレゼンテーションに続いて、エリック・バークから広場、(私が言っているのAndroid開発者のための便利なツールの多くの偉大なプレゼンテーションであると私は広場にどのような方法で関連しておりません)

http://www.infoq.com/presentations/Android-Design/

過去数か月の私の個人的な経験から、アプリケーションを構築する最良の方法は、アプリケーションのフローを表すようになるフラグメントのグループを作成し、それらすべてのフラグメントを1つに表示することであることがわかりましたActivity。したがって、基本的Activitiesに、アプリケーションにはフローの数と同じ数が含まれます。このようにして、アクションバーはフローのすべての画面でそのまま残りますが、フローを変更すると再作成されます。これは非常に理にかなっています。エリック・バークが述べているように、そして私も気付いたようにActivities、できるだけ少なく使用するという哲学は、彼が「神」活動と呼ぶものに混乱をもたらすため、すべての状況に適用できるわけではありません。

14 answers

282
sandalone 2014-09-24 00:42.

専門家は、「UIを見ると、Activityまたはを使用するかどうかがわかります」と言うでしょうFragment。最初はこれは意味がありませんが、やがて、必要Fragmentかどうかを実際に判断できるようになります。

私にとって非常に役立つと思った良い習慣があります。私が娘に何かを説明しようとしていたときに、それは私に起こりました。

つまり、画面を表すボックスを想像してみてください。このボックスに別の画面をロードできますか?新しいボックスを使用する場合、最初のボックスから複数のアイテムをコピーする必要がありますか?答えが「はい」の場合は、を使用する必要がありますFragments。ルートActivityは重複するすべての要素を保持できるため、要素の作成にかかる時間を節約でき、ボックスの一部を簡単に置き換えることができます。

しかし、忘れてはいけないあなたは常にボックスコンテナを(必要であることActivity)したり、部品が分散されます。つまり、中に部品が入った1つの箱です。

ボックスを誤用しないように注意してください。Android UXの専門家Activityは、Fragment(カテゴリのあるナビゲーションドロワーを扱う場合のように)を使用する代わりに、別のを明示的にロードする必要がある場合にアドバイスします(YouTubeで見つけることができます)。に慣れたらFragments、すべての動画を見ることができます。さらに、それらは必須の資料です。

今すぐUIを見て、Activityまたはが必要かどうかを判断できますFragmentか?あなたは新しい視点を得ましたか?私はあなたがしたと思います。

139
VJ Vélan Solutions 2013-12-01 13:02.

私の哲学はこれです:

絶対に必要な場合にのみアクティビティを作成してください。一連のフラグメントトランザクションをコミットするためにバックスタックを使用できるようにしたので、アプリで作成するアクティビティをできるだけ少なくするようにしています。また、さまざまなフラグメント間の通信は、アクティビティ間でデータを送受信するよりもはるかに簡単です。

活動の移行には費用がかかりますよね?少なくとも私はそう信じています-古いアクティビティを破棄/一時停止/停止し、スタックにプッシュしてから、新しいアクティビティを作成/開始/再開する必要があるためです。

フラグメントが導入されて以来、それは私の哲学です。

62
android developer 2013-12-01 12:16.

グーグルの講義によると(多分ここで、私は覚えていません)、コードの保守と制御が簡単になるので、可能な限りフラグメントの使用を検討する必要があります。

ただし、フラグメントをホストするアクティビティがフラグメント間をナビゲート/通信する必要があるため、場合によっては複雑になりすぎる可能性があると思います。

自分に最適なものは自分で決めるべきだと思います。通常、アクティビティをフラグメントに、またはその逆に変換することはそれほど難しくありません。

さらに読みたい場合は、このディレマに関する投稿をなぜフラグメントなのか、そしていつアクティビティの代わりにフラグメントを使用するのか?に作成しました。

36
Francis 2019-01-04 05:59.

Jetpack以降、シングルアクティビティアプリが推奨されるアーキテクチャです。特にナビゲーションアーキテクチャコンポーネントで役立ちます

ソース

29
Qylin 2015-12-04 02:47.

すべてのケースでアクティビティよりもフラグメントを好む理由。

  • 活動は高価です。フラグメントでは、ビューとプロパティの状態が分離backstackされます。フラグメントが含まれると、そのビューは破棄されます。したがって、アクティビティよりもはるかに多くのフラグメントをスタックできます。

  • Backstack操作。を使用するとFragmentManager、すべてのフラグメントをクリアしたり、フラグメントなどよりも多くを挿入したりするのが簡単です。しかし、アクティビティにとって、それらを操作することは悪夢になります。

  • 非常に予測可能なライフサイクル。ホストアクティビティがリサイクルされない限り。バックスタック内のフラグメントはリサイクルされません。したがって、FragmentManager::getFragments()特定のフラグメントを見つけるために使用することが可能です(推奨されていません)。

14
Isaac Urbina 2016-03-13 12:41.

私の意見では、それは実際には関係ありません。考慮すべき重要な要素は

  1. UIの一部(メニューなど)を再利用する頻度はどれくらいですか。
  2. このアプリはタブレットにも対応していますか?

フラグメントの主な用途は、マルチペインアクティビティを構築することです。これにより、タブレット/電話対応アプリに最適です。

11
guest 2015-02-03 06:15.

アクティビティは、Intentを介して共有および開始できるアプリケーションのブロック/コンポーネントであることを忘れないでください。したがって、アプリケーションの各アクティビティは、1種類のタスクのみを解決する必要があります。アプリケーションにタスクが1つしかない場合は、必要なアクティビティは1つだけで、必要に応じて多くのフラグメントが必要だと思います。もちろん、別のタスクを解決する将来のアクティビティでフラグメントを再利用できます。このアプローチは、タスクの明確で論理的な分離になります。また、フラグメントのセットごとに異なるインテントフィルターパラメーターを使用して1つのアクティビティを維持する必要はありません。要件に基づいて、開発プロセスの設計段階でタスクを定義します。

9
TheHebrewHammer 2015-08-06 04:27.

これには、あなたが理解している以上のことがあります。起動されたアクティビティが呼び出し元のアクティビティを暗黙的に破壊しないことを覚えておく必要があります。もちろん、ユーザーがボタンをクリックしてページに移動し、そのページのアクティビティを開始して現在のアクティビティを破棄するように設定できます。これにより、多くのオーバーヘッドが発生します。私があなたに与えることができる最高のガイドは:

**新しいアクティビティを開始するのは、メインアクティビティとこのアクティビティを同時に開くことが理にかなっている場合のみです(複数のウィンドウを考えてみてください)。

複数のアクティビティがあることが理にかなっている場合の良い例は、Googleドライブです。メインアクティビティはファイルエクスプローラーを提供します。ファイルを開くと、そのファイルを表示するための新しいアクティビティが起動されます。最近のアプリボタンを押すと、開いているドキュメントを閉じずにブラウザに戻ることができ、最初のドキュメントと並行して別のドキュメントを開くこともできます。

8
I Love Coding 2015-11-18 17:01.

私がしたこと:可能な場合はフラグメントの使用を減らします。残念ながら、ほとんどの場合それは可能です。だから、私はたくさんの断片と少しの活動になってしまいます。私が気付いたいくつかの欠点:

  • ActionBar&メニュー:2つのフラグメントのタイトル、メニューが異なる場合
    、処理が困難になります。例:新しいフラグメントを追加するときにアクションバーのタイトルを変更できますが、backstackそこからポップすると古いタイトルを復元する方法はありません。この場合、すべてのフラグメントにツールバーが必要になる場合がありますが、信じてください。これにより、より多くの時間が費やされます。
  • 必要な場合startForResult、アクティビティにはありますが、フラグメントにはありません。
  • デフォルトではトランジションアニメーションはありません

これに対する私の解決策は、アクティビティを使用してフラグメントを内部にラップすることです。したがって、個別のアクションバー、メニュー、、startActivityForResultアニメーション、...があります。

5
Sanchit Bhasin 2016-06-10 09:38.

fragmentオーバーアクティビティの大きな利点の1つは、フラグメントに使用されるコードをさまざまなアクティビティに使用できることです。そのため、アプリケーション開発でコードを利用できます。

3
varg 2016-09-09 14:53.

ためのベースを提供するために使用するアプリケーションごとに活動をfragment 使用fragment画面で、 fragmentsあるライト重量と比較して、activites フラグメントはれる再使用可能な 断片がさ適し電話&タブレットの両方をサポートするアプリの

2
Franklin Hirata 2017-09-29 13:19.

あなたはそれらの1つを自由に使うことができます。
基本的に、アプリに最適なものを評価する必要があります。ビジネスフローを管理する方法と、データ設定を保存/管理する方法を検討してください。

フラグメントがガベージデータを保存する方法について考えてみてください。フラグメントを実装すると、フラグメントで埋めるアクティビティルートがあります。したがって、フラグメントが多すぎる多くのアクティビティを実装しようとしている場合は、アプリのパフォーマンスを考慮する必要があります。2つのコンテキストライフサイクルを操作している(大まかに言えば)ので、複雑さを覚えておいてください。

覚えておいてください:フラグメントを使用する必要がありますか?なぜ私はすべきではないのですか?

よろしく。

1
Theo 2016-05-29 22:37.

ユーザーエクスペリエンスを向上させるためにフラグメントを使用しています。たとえば、ボタンがあり、それをクリックしたときにWebサービスを実行したい場合は、親アクティビティにフラグメントを添付します。

if (id == R.id.forecast) {

    ForecastFragment forecastFragment = new ForecastFragment();
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.main_content, forecastFragment);
    ft.addToBackStack("backstack");
    forecastFragment.setArguments(b);
    ft.commit();
}

そうすれば、ユーザーは別のアクティビティに移動する必要がなくなります。

そして第二に、回転中に簡単に処理できるフラグメントが好きです。

1
Theo 2016-12-22 09:06.

それはあなたが本当に作りたいものに依存します。たとえば、navigation drawerはフラグメントを使用します。タブも使用fragmentsします。別の良い実装は、あなたが持っているところですlistview。電話を回転させて行をクリックすると、画面の残りの半分にアクティビティが表示されます。個人的に、私が使用fragmentsし、fragment dialogsそれがより専門的であるとして、。さらに、ローテーションでの取り扱いが簡単です。

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

Netflixのジョエルマクヘイルとのジョエルマクヘイルショーは、ジョエルマクヘイルにぴったりの車を復活させます

Netflixのジョエルマクヘイルとのジョエルマクヘイルショーは、ジョエルマクヘイルにぴったりの車を復活させます

ジョエル・マクヘイル、マイク・コルター(スクリーンショット:Netflix)「私の神よ、これは1つのことを変えます。」これは、ジョエル・マクヘイルとのジョエル・マクヘイルショーの最後のジョークです。リアリティ番組の嘲笑と寛大なスナキネスの時間は、なじみのある顔を見つけます。

チームロケットは20年ぶりにポケモンシリーズでアッシュを破った

チームロケットは20年ぶりにポケモンシリーズでアッシュを破った

画像経由:@pancakeparadox(Twitter)。1997年にポケモンシリーズが初公開されて以来、チームロケット(またはラテンアメリカではチームロケット)として知られる悪役のグループは、何度もアッシュに直面してきました。

今週の科学技術でトランプがめちゃくちゃになったことすべて

今週の科学技術でトランプがめちゃくちゃになったことすべて

画像:ゲッティ私たち全員が千年もの間生きていて、私たちの体が燃える風によってほこりと長引く悲鳴だけに押し流されたと考えるのは驚くべきことです。私たちがそうしていないことを除いて、それはトランプ政権の最初の週の終わりであり、驚くほど多くの恐ろしいことがすでに起こっています。

あなたの「マイクロピッグ」が代わりに通常のピッグになってしまったとしても驚かないでください

あなたの「マイクロピッグ」が代わりに通常のピッグになってしまったとしても驚かないでください

そして今、あることを手に入れていると思っていたが、まったく別のことをしてしまった男の話。CBSニュースは、彼女が「ミニブタ」であるという誤ったふりをしてエスターを養子にしたカナダ人のスティーブジェンキンスの心温まる物語をもたらします。これは、特にせいぜいゴールデンレトリバーまたはセントバーナードをストラップします。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language