[Android] ジレンマ:フラグメントとアクティビティの使用時期:


Answers

私の哲学はこれです:

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

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

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

Question

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を使用するという理念は、「神」活動と呼ばれるものに混乱を招くため、あらゆる状況に適用できるわけではありません。




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

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

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




私は、フラグメントを使うことは、アクティビティを使うよりも優れていると思いますが、フラクションを使ってバックスタックボタンを管理するのは難しいです




アプリケーションごとに1つのアクティビティを使用して、 fragment使用するための基礎を提供します。画面のfragmentsfragmentsは、アクティビティと比較して軽量です。フラグメントは、 再利用可能なフラグメントです。




私の意見では、それは本当に関連性がありません。 考慮すべき重要な要素は次のとおりです。

  1. どのくらいの頻度でUIの部分を再利用するか(たとえばメニュー)
  2. タブレットアプリでもありますか?

フラグメントの主な用途は、multipaneアクティビティを構築することです。これは、Tablet / Phone対応のアプリケーションに最適です。




私はより良いユーザー体験のためにFragmentsを使用します。 たとえば、Buttonを持っていて、それをクリックしたときにwebserviceを実行しようとしている場合は、その親アクティビティにFragmentを添付します。

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();
}

このようにして、ユーザーは別のアクティビティに移動する必要はありません。

第二に、回転中に簡単に扱うことができるので、私はFragmentsを好んでいます。




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

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

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

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