1つのアクティビティと他のすべてのフラグメント[終了]


158

私は1画面の実装を考えていますActivityし、他のすべてのsreens Fragmentsmanaging all the fragments thru the activity

それは良い考えですか?私の答えは「いいえ」ですが、それでもこの考えについてもっと明確に知りたいのです。

アイデアの長所と短所は何ですか?

注意:

フラグメントとアクティビティのリンクを教えないでください。

編集:

これはフラグメントとアクティビティに関するものです:

長所:

  1. フラグメントは、サブアクティビティとしてのアクティビティで使用されることを意図しています。
  2. フラグメントはアクティビティの代わりにはなりません。
  3. フラグメントは再利用性を目的としています(再利用性を実現する方法を知る必要があります)。
  4. フラグメントは、タブレットと電話の両方をサポートするコードを作成するための最良の方法です。

短所:

  1. フラグメントからデータを取得するには、インターフェースを実装する必要があります。
  2. 対話については、それを示すのに長い道のりが必要です。

タブレットを考慮しない場合、なぜフラグメントを使用する必要があるのですか?アクティビティとフラグメントの開始時間の違いは何ですか?


答えがノーだと思う理由を詳しく説明できますか?私はたまたまそう思いませんが、私たちがそれらの懸念が何であるかを知っている場合、そのアプローチについてあなたが持つかもしれない懸念に対処する方が簡単です。
Alexander Lucas

1
@AlexanderLucasそうすることでコードのモジュール性が低下し、複雑さが増すため、私が答えなかった答え。
Vineet Shukla 2012

@スキーあなたはあなたの答えを受け入れることにもっと集中しています。
Vineet Shukla 2012

3
これを見つけた人のために、物事は非常に複雑になったので、リファクタリングを停止しました。
theblang 2014年

18
これは良い質問であり、閉じられるべきではありませんでした。
ジムインテキサス2015年

回答:


94

作成するアプリによって異なります。私は両方のアプローチを使用していくつかのアプリを作成しましたが、一方が他方よりも常に優れているとは言えません。私が作成した最新のアプリでは、単一のActivityアプローチとFacebookスタイルのナビゲーションを使用しました。ナビゲーションリストからアイテムを選択するとき、Fragmentそのセクションを表示するように単一のコンテナーを更新します。

とはいえ、シングルを使用すると、Activity複雑さが増します。編集フォームがあり、ユーザーが選択または作成する必要がある一部のアイテムについて、新しい画面に移動する必要があるとします。アクティビティでは、新しい画面をstartActivityForResultが、とFragmentsあなたは上の値を格納し終わるようなものは存在しないActivityとメインの編集フラグメントはチェックしたActivityデータが選択されていて、ユーザーに表示する必要があるかどうかを確認するためには。

Aravindが単一のActivity型に固執することについて言っていることも真実ですが、実際にはその制限ではありません。あなたの活動はFragmentActivityであり、あなたがそれを必要としない限り、MapView実際の制限はありません。ただし、マップを表示したい場合は可能ですが、FragmentActivity拡張するようにAndroid互換ライブラリを変更するかMapActivity、公開されているandroid-support-v4-googlemapsを使用する必要があります。

結局のところ、私が知っているほとんどの開発者はActivity、コードを簡略化するために、1つのルートで複数のアクティビティに戻ってきました。UIに関しては、タブレットではActivity、デザイナーが思いついたクレイジーなインタラクションを実現するためだけに、シングルを使用するのが難しい場合があります。

-編集-

グーグルがついにリリース MapFragment互換性ライブラリをしたため、android-support-v4-googlemapsハックを使用する必要がなくなりました。アップデートについてはこちらをお読みください:Google Maps Android API v2

-編集2-

私はフラグメントの現代(2017)の状態に関するこの素晴らしい記事を読んだだけで、この古い答えを思い出しました。私が共有すると思いました:フラグメント:Androidのすべての問題の解決策


6
ありますsettargetfragmentと次のような活動扱うことができるstartforresult手順を。
Lalith B 2013

1
私の意見では、活動は古いシステムだからといって存在しています。以前はフラグメントは存在しませんでした。手続き以外に、アクティビティにできることとフラグメントにできないことは本当にありません。ある時点で活動が削除され、すべてが断片であると想像することもできます。
Ixx

1
あなたが与えるフラグメントのみの短所を要約すると、実際には何もありません。Lalith Bが言うようにstartActivityForResultには対応するものがあり、マップも問題ではありません。その上、すべて(状態の保存など)は、フラグメントのライフサイクルメソッドで処理できます。
Ixx、

85

1アクティビティ、17フラグメント、すべてフルスクリーンのプロジェクト(開発中5か月)を終了しようとしています。これは私の2番目のフラグメントベースのプロジェクトです(以前は4か月でした)。

長所

  • 主なアクティビティは700行のコードで、フラグメントナビゲーションの順序を適切に管理します。
  • 各フラグメントは独自のクラスにうまく分割されており、比較的小さい(UI行の数百行を結合する)。
  • 経営陣は、「画面の順序を入れ替えるのはどうだ」と言うことができます。これらのフラグメントは相互に依存していないため、アクティビティを通じて通信するため、非常に簡単に行うことができます。私は個々の活動を掘り下げる必要はありません。彼らがお互いを呼ぶ場所を見つけるために。
  • 私のアプリはグラフィックが非常に重いため、1画面1のアクティビティとしては機能しません。メモリ内のこれらすべてのサブアクティビティは、アプリを常にメモリ不足finish()にするため、フラグメントに対して行うのと同じように、すべての非表示のアクティビティとナビゲーション用の同じ制御ロジックを作成する必要があります。だからといって、断片でそれを行うこともできます。
  • タブレットアプリを使用する場合、すべてが既に適切に分離されているため、データのリファクタリングが簡単になります。

短所

  • あなたはフラグメントを使用する方法を学ぶ必要があります

1
フラグメントが多すぎて現在は活動していることについては確信がありませんでした...制作上の問題、そして責任はあなたにあります!! :)
シャハール2014

1
@Dinashは、OSにアクティビティを再開させません。自分で向きの変更を処理します。もっとここで読む:stackoverflow.com/questions/5913130/...
タマス

1
@Tamasマルチフラグメント画面(例:master-detail)はありましたか?ある場合、どのように処理しましたか?
theblang 2014年

7
@TamasこのアプローチはAndroidに大きく反しています。あなたはGODクラスに終わります。Androidシステムは、アクティビティで機能するように設計されています。たとえば、複数のフラグメント内でツールバーを処理するための良い方法がありません。結果の開始フラグメントはなく、さらに多くのフラグメントにはありません。つまり、すでに存在するロジック全体を書き換える必要があります。ローカルブロードキャストレシーバー、サービス、その他のAndroidコンポーネントについてはどうですか。サービスを開始するには、次のことを行う必要があります:getActivity()!= null ...これは本当に醜いです。また、フラグメントが多い場合、フラグメント間の通信は非常に奇妙です。
テオドール2016年

9
700行!!!! 「素敵に」???? クラスは無料です。
beplaya 2016

16

まず、何をする場合でも、アクティビティやフラグメントにあまり依存しない、モデル、ビュー、プレゼンターを使用したモジュール設計であることを確認してください。

アクティビティとフラグメントは実際に何を提供しますか?

  1. ライフサイクルイベントとバックスタック
  2. コンテキストとリソース

したがって、それらにのみ使用してください。彼らには十分な責任があり、過度に複雑にしないでください。ActivityまたはFragmentでTextViewをインスタンス化することも悪い習慣だと私は主張します。public View findViewById(int id)のようなメソッドがPUBLICである理由があります。

質問が簡単になりました。複数の独立したライフサイクルイベントとバックスタックが必要ですか?そうだと思うなら、フラグメントを使用してください。考えたことがない場合は、フラグメントを使用しないでください。

最後に、独自のバックスタックとライフサイクルを作成できます。しかし、なぜホイールを再作成するのですか?

編集:なぜこれに反対票を投じるのですか?単身クラスの人!各アクティビティまたはフラグメントは、ビューをインスタンス化するプレゼンターをインスタンス化できる必要があります。プレゼンターとビューは交換可能なモジュールです。アクティビティまたはフラグメントにプレゼンターの責任が必要なのはなぜですか?


うーん...ビューのインスタンス化が悪い習慣であることとfindViewById()publicの関係は不明です。ビューのインスタンス化については同意しますが、他のクラスからfindViewByIdを呼び出すことも検討します(たとえば、フラグメントをホストするアクティビティがフラグメントでそれを呼び出すなど)は悪い習慣です。これがパブリックである理由を本当に知らないでください。少なくとも、私が考えることができるケースでは、これはコードが乱雑になり、モジュール設計にならないためです。
Ixx

私見:ビューとプレゼンターにアクティビティを渡すと(2つを「モジュール」と呼びます)、そのモジュールを他のアクティビティと一緒に再利用できます。それが役立つ場合は、必要なthngのみを公開するintrfceとしてアクティビティを渡すのが最善です。アクティビティの外でビューを見つけるのが嫌であれば、そのインターフェースを介してすべてのビューをpres./viewに挿入できます。主なポイントは、AndroidのコーディングはActvitiesとFragsの概念よりも外側で実行する必要があることです。これにより、2つのbtwnを切り替えるのが簡単になります。コード。
beplaya 2014年

3
MVPを手放すと、Androidがなくてもうまくいきます。特定の形状のブロックを別の形状の穴に通そうとするのに多くの時間を費やすことができますが、それは難しいことですが、時間をかけたほうが賢明な機能要件があるはずです。
ストラヤ2015

12

長所

すべてのフラグメントが互いに独立しているため、単一のアクティビティからフラグメントを制御できます。断片は、ライフサイクル(持っているonPauseonCreateonStart自分自身のを...)。ライフサイクルを持つことにより、フラグメントはイベントに独立して応答し、状態を保存できます。onSaveInstanceState元に戻すことができます(つまり、着信呼び出しの後に再開したとき、またはユーザーが[戻る]ボタンをクリックしたときなど)。

短所

  1. アクティビティのコードを複雑にします。
  2. フラグメントの順序を管理する必要があります。

それでも、いくつかのビューを表示したいアプリを作成する必要があるかのように、それは非常に良いアイデアです。このアイデアにより、複数のフラグメントを1つのビューで表示できるようになります。


2

アプリのデザインレイアウトによって異なります。デザインレイアウトのActionBarでタブを使用している場合、アプリのシングルアクティビティでタブをクリックするとフラグメントが変更される可能性があるとします。これで、Activityに3つのタブがあり、Fragmentsによってタブのビューが提供されていると仮定すると、plusの管理が容易になります。したがって、それはすべて、アプリのデザインスキームと、アプリのビルドをどのように決定するかによって異なります。


1

長所:

  • XMLレイアウトを介して複数の画面サイズと向きで使用できる単一のインターフェースを作成するために使用できます。

短所:

  • アクティビティにはより複雑なコードが必要です。

現在の画面サイズと向きに基づいて異なるxmlレイアウトを使用すると、アプリがより使いやすくなり、携帯電話とタブレットの両方でアプリをリリースする予定がある場合は、アプリの複数のバージョンをリリースする必要性を減らすことができるので、それは良い考えだと思います。アプリがタブレットと携帯電話の両方で使用されることがないのであれば、おそらく問題はありません。


向きについては、異なるxmlベースのレイアウトを使用する必要はありません。
Vineet Shukla 2012

@VineetShuklaはtrueですが、これはオプションであり、画面サイズに基づいてさまざまなxmlレイアウトを使用するのと同じです。たとえば、Androidスマートフォンのホーム画面を横向きと縦向きで表示すると、レイアウトが異なります。
スキー

0

私は、すべてのビューインフレをフラグメントに延期して、より優れた柔軟性を提供することを提案しています。たとえば、複数のフラグメントを集約するタブレットの単一のランディングアクティビティを持ち、同じフラグメントを電話で再利用して、フラグメントごとに1つの画面を表示します。ただし、電話の実装では、画面ごとに個別のアクティビティがあります。アクティビティは、ビューのインフレーションのためにすぐに対応するフラグメントに依存するため、コードが多すぎません。

タブまたはメニューナビゲーションは完全に新しい画面を表示するだけなので、タブまたはスライドアウトメニューが導入されたときに、電話の実装が単一のランディングアクティビティに変更する必要があるのは悪い考えだと思います。


「タブまたはメニューナビゲーションがまったく新しい画面を表示するだけなので、タブまたはスライドアウトメニューが導入されたときに、電話の実装が単一のランディングアクティビティに変更する必要があるのは悪い考えだと思います。」->正確には何を意味するのか理解できませんが、シングルアクティビティアプリ(タブレット/電話)では、タブもサイドメニューも問題ありません。
Ixx

-1

単一アクティビティアプローチを使用しないことで私が与える最も重要な理由は、アクティビティライフサイクルを利用できるようにするためです。アクティビティには、アプリケーションの特定の部分のコンテキスト動作が含まれ、フラグメントはその動作を補足します。onPauseやなどのメソッドを使用して、アクティビティのライフサイクルでオーバーライド可能なステップを利用する機能を使用すると、あるアクティビティの動作を別のアクティビティから分離できますonResume。このライフサイクルでは、前のコンテキストに戻ることもできます。シングルアクティビティアプローチでは、フラグメントを離れると、フラグメントに戻るメカニズムを作成する必要があります。


4
これは本当だとは思わない。フラグメントのライフサイクルのドキュメント(developer.android.com/guide/components/fragments.html#Lifecycle)から:「フラグメントが存続するアクティビティのライフサイクルは、フラグメントのライフサイクルに直接影響するため、アクティビティの各ライフサイクルコールバックは結果として、各フラグメントに対して同様のコールバックが生成されます。たとえば、アクティビティがonPause()を受け取ると、アクティビティの各フラグメントがonPause()を受け取ります。
スキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.