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

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

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

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

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

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

引退した一郎:「私はただ死ぬと思う」

引退した一郎:「私はただ死ぬと思う」

写真:リッチシュルツ/ APマーリンズ外野手/野球のトゥルーヒットキング鈴木一郎は43歳ですが、近い将来、プロ野球をやめるつもりはありません。昨年、彼は143試合に出場し、ヒットしました。

12年後、有名なクラブペンギン氷山がついにヒント

12年後、有名なクラブペンギン氷山がついにヒント

約12年間の運用後、ディズニーの子供向けのMMOクラブペンギンは閉店しますが、プレーヤーがゲームで最も長く実行されているミームの1つを実現する機会を得る前ではありません。氷山がひっくり返った。

安い航空券はあなたが思っているほどお得ではありません

安い航空券はあなたが思っているほどお得ではありません

お気に入りのレストランが割引価格で食事を提供し始めたが、ナプキン、フォーク、または座席が必要な場合は追加料金を支払う必要があるとします。私たちのほとんどはおそらく彼らに私たちのビジネスを与えることを躊躇するでしょうが、その躊躇は航空運賃に変換されません。

注意してください、あなたが話す次の男はUFCファイターかもしれません

注意してください、あなたが話す次の男はUFCファイターかもしれません

マークハントはUFCで最もヘビーな打者かもしれません。彼はほぼ間違いなく、現在オーストラリアに住んでいる最もタフなファイターです。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

安全な公衆パニックルーム

安全な公衆パニックルーム

不気味な音に慣れて、コンクリートの周りをうろつきます。痛みや苦い口を吐き出し、「過ち」の不思議な病気を通してもう一度味わうことを切望します。

長い間行方不明だった 2 つのサンフランシスコ クリークが間もなく日の目を見る可能性がある

都市の水路を回復する理由はたくさんありますが、気候が変化するにつれて、それらはすべてより持続可能な未来につながります.

長い間行方不明だった 2 つのサンフランシスコ クリークが間もなく日の目を見る可能性がある

サンフランシスコの長い間失われた小川を復元する動きが高まっており、コミュニティを地域の生態系と結びつけ、また、都市が気候変動や季節的な洪水に適応するのに役立つ新しいタイプの「グリーン インフラストラクチャ」を作成しています。最新の取り組みは町の 2 つの非常に異なる場所で行われており、それらは明確ではあるが補完的な方法で展開されています。

サンフランシスコのベイエリアで家族写真が撮れる場所トップ 5

サンフランシスコのベイエリアで家族写真が撮れる場所トップ 5

ベイエリアには写真を撮るための美しい屋外スポットがたくさんあります。この記事のすべての写真は、ベイエリアにいるさまざまな PictureHum フォトグラファーとの PictureHum セッションからのものです。

退屈に耐えられないから生きていけない

退屈に耐えられないから生きていけない

それが現代の衝動です — より少ないもので世界を覆し、私たちのほんのわずかな瞬間を自分たちから盗もうとする. 私はかつてダイニングルームのソファで一日を過ごし、祖父母の農家に斜めに差し込む光を眺め、私には関係のない世界について話している大人のつぶやきを半分聞いたり、壁を通してくぐもったテレビを聞いたり、遊んだりしました。床と犬と私の小さな靴を暖めた太陽の黒点と。

Language