android - 片平 fragment ジレンマ:フラグメントとアクティビティの使用時期:




6 Answers

私の哲学はこれです:

絶対に必要な場合にのみアクティビティを作成してください。 バックスタックがフラグメントトランザクションの束をコミットするために利用可能になったので、私は可能な限り私のアプリで最小限のアクティビティを作成しようとします。 また、さまざまなフラグメント間の通信は、アクティビティ間でデータをやりとりするよりはるかに簡単です。

アクティビティの遷移は高価です 少なくとも、私はそう信じています - 古い活動が破壊/一時停止/停止されてスタックにプッシュされてから新しい活動を作成/開始/再開する必要があるからです。

それは断片が導入されて以来、私の哲学です。

fragment 藤原

Activitiesは自分のアプリケーションの1つの画面を表現するように設計されていますが、 Fragmentsはロジックが組み込まれた再利用可能なUIレイアウトになるように設計されています。

それほど前まで、開発すべきだと言ったアプリケーションを開発しました。 私は自分のアプリケーションの画面を表現するActivityを作成し、 ViewPagerまたはGoogle Mapsためにフラグメントを使用しGoogle Maps 。 私は、 ListFragmentや他のUIを何度か再作成することはめったにありませんでした。

最近、私は2つのActivitiesだけがSettingsActivityあり、他のActivitiesMainActivityであるプロジェクトを見つけました。 MainActivityのレイアウトには、多くの非表示のフルスクリーンUIフラグメントが挿入され、1つだけが表示されます。 Acitivtyロジックには、アプリケーションの異なる画面間に多数のFragmentTransitionsがあります。

私がこのアプローチについて好んだのは、アプリケーションがActionBar使用しているため、それはそのままの状態で、スクリーン切り替えアニメーションでは動きません。これはActivity切り替えで起こることです。 これにより、これらの画面遷移に対してより滑らかな感触が与えられます。

だから私はこのトピックに関するあなたの現在の開発方法を分かち合うことを頼んでいると思いますが、最初の見解では意見に基づいた質問のように見えるかもしれませんが、私はAndroidの設計とアーキテクチャの質問としてそれを見ています...意見に基づくもの。

UPDATE(01.05.2014): SquareからのEric Burkeによるこのプレゼンテーションに続いて(私は言うべきことは、アンドロイドの開発者のための多くの便利なツールを備えた素晴らしいプレゼンテーションです。

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

ここ数ヶ月の私の個人的な経験から、アプリケーションを構築する最善の方法は、アプリケーション内のフローを表現するフラグメントのグループを作成し、そのすべてのフラグメントを1つのActivity提示することです。 したがって、基本的には、アプリケーションのフロー数と同じ数のActivitiesします。 そのようにして、アクションバーはすべてのフローの画面にそのまま残りますが、多くの意味を持つフローを変更すると再作成されます。 エリック・バークが述べているように、私が実現するようになった現在、できるだけ少数のActivitiesを使用するという考え方は、「神」活動と呼ばれるものに混乱を招くため、あらゆる状況に適用できるわけではありません。




なぜ私はすべてのケースでアクティビティの断片を好むのですか?

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

  • Backstack操作。 FragmentManager 、すべてのフラグメントをクリアしたり、フラグメントやその他より多くを挿入したりするのは簡単です。 しかし、活動のために、それらのものを操作するのは悪夢になるでしょう。

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




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

**主なアクティビティーとこのアクティビティーを同時に開く(複数のウィンドウを考える)場合にのみ、新しいアクティビティーを開始してください。

複数のアクティビティを持つことが理想的な場合の大きな例は、Googleドライブです。 主なアクティビティにはファイルエクスプローラが用意されています。 ファイルを開くと、新しいアクティビティが起動してそのファイルが表示されます。 最近使ったアプリケーションボタンを押すと、開いているドキュメントを閉じずにブラウザに戻り、別のドキュメントを開くこともできます。




私がしたこと:できるだけ少ない断片を使う。 残念ながら、ほとんどの場合可能です。 だから、私は多くの断片と活動の少しで終わる。 私が実現したいくつかの欠点:

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

これに対する私の解決策は、アクティビティを使用してフラグメントを内部でラッピングすることです。 だから我々は別のアクションバー、メニュー、 startActivityForResult 、アニメーションを持っている...




あなたはそのうちの1つを自由に使うことができます。
基本的には、あなたのアプリにとって一番良いものを評価する必要があります。 ビジネスフローをどのように管理するのか、データの設定を保存/管理する方法について考えてみましょう。

Fragmentsがガベージデータをどのように格納しているかを考えてみましょう。 フラグメントを実装するときには、フラグメントを埋め込むアクティビティルートがあります。 したがって、あなたが多すぎる断片で多くのアクティビティを実装しようとするなら、アプリケーションのパフォーマンスを考慮する必要があります。複雑なことを2つのコンテキストのライフサイクルを操作(粗く話す)してください。

覚えておいてください:断片を使うべきですか? なぜ私はいけませんか?

敬具。




それは本当にビルドしたいものに依存します。 たとえば、 navigation drawerはフラグメントを使用します。 タブはfragmentsも使用します。 もう一つの良い実装は、あなたがlistviewを持っている場所です。 電話機を回転させて行をクリックすると、残りの半分にアクティビティが表示されます。 個人的には、よりプロフェッショナルなので、 fragmentsfragment dialogsを使用しfragment dialogs 。 加えて、回転で扱いやすくなります。




Related