web-dev-qa-db-ja.com

なぜ断片であり、いつアクティビティの代わりに断片を使用するのでしょうか。

Android API 11以降で、GoogleはFragmentという新しいクラスをリリースしました。

ビデオでは、グーグルは可能な限り(= link1link2 )アクティビティの代わりにフラグメントを使用するべきですが、その理由を正確に説明していません。

フラグメントの目的とその使用方法は何ですか(単純なビュー/レイアウトで簡単に達成できるUIの例以外)。

私の質問は断片についてです。

  1. フラグメントを使用する目的は何ですか?
  2. アクティビティ/ビュー/レイアウトを使用するのに比べてフラグメントを使用することの利点と欠点は何ですか?

ボーナス質問:

  1. あなたはフラグメントのためのいくつかの本当に興味深い用途を与えることができますか?グーグルが彼らのビデオで言及しなかったこと?
  2. 断片とそれを含む活動の間でコミュニケーションをとるための最善の方法は何ですか?
  3. フラグメントを使用するときに覚えておくべき最も重要なことは何ですか?あなたの経験からのヒントや警告はありますか?
428

#1と#2フラグメントを使用する目的は何ですか?また、アクティビティ/ビュー/レイアウトを使用する場合と比較してフラグメントを使用する利点と欠点は何ですか?

フラグメントは、再利用可能なユーザーインターフェースを作成するためのAndroidのソリューションです。アクティビティやレイアウトを使用しても(たとえば、インクルードを使用して)同じことを実現できます。しかしながら;フラグメントは、HoneyCombから、そしてそれ以降まで、Android APIに組み込まれています。詳しく説明しましょう。

  • ActionBar。タブを上に移動してアプリケーションをナビゲートしたい場合は、ActionBar.TabListenerインターフェースがFragmentTransactionメソッドへの入力引数としてonTabSelectedを与えることがすぐにわかります。あなたはおそらくこれを無視して何か他のことをして賢いことができますが、あなたはそれに対してではなく、APIに対して働いているでしょう。

  • FragmentManagerはあなたのために非常に賢い方法で"戻る"を取り扱います。戻るとは、通常の活動のように最後の活動に戻ることを意味するのではありません。前のフラグメント状態に戻ることを意味します。

  • スワイプインターフェースを作成するには、クールなViewPagerFragmentPagerAdapterと一緒に使用できます。 FragmentPagerAdapterコードは通常のアダプタよりもはるかにクリーンであり、個々のフラグメントのインスタンス化を制御します。

  • あなたが携帯電話とタブレットの両方のためのアプリケーションを作成しようとするときあなたがフラグメントを使うならばあなたの人生はずっと楽になるでしょう。フラグメントはHoneycomb + APIと非常に密接に結び付いているので、コードを再利用するためにも電話でそれらを使用したいと思うでしょう。それが互換性ライブラリが便利になるところです。

  • あなたは電話だけのために意図されたアプリケーションのために断片さえ使用することができてそしてそうすべきです。あなたが念頭に置いて移植性を持っている場合。私はActionBarSherlockと互換性ライブラリを使用して「ICSに見える」アプリを作成します。これはバージョン1.6までずっと同じように見えます。タブ、オーバーフロー、分割アクションバー、ビューページャなどを含むActionBarのような最新の機能を利用できます。

ボーナス2

フラグメント間で通信するための最良の方法はインテントです。フラグメントの中で何かを押すと、通常はデータが入ったStartActivity()を呼び出します。意図はあなたが立ち上げる活動のすべての断片に渡されます。

260
Glenn Bech

どのビデオを参照しているのかわからないが、アクティビティではなくフラグメントを使用するべきだと言っているのではないかと思います。これらは直接互換性がないからです。 Dev Guideには実際にはかなり 詳細なエントリ があります。詳細についてはそれを読むことを検討してください。

つまり、フラグメントはアクティビティの内部に存在し、各アクティビティは多数のフラグメントをホストできます。アクティビティと同様に、特定のライフサイクルがあります。アクティビティとは異なり、それらは最上位のアプリケーションコンポーネントではありません。フラグメントの利点には、コードの再利用やモジュール化(たとえば、多くのアクティビティで同じリストビューを使用すること)などがあります。これには、マルチペインインターフェイスを構築する機能(主にタブレットで役立ちます)が含まれます。主な不利な点は、(いくらか)複雑さが増すことです。一般的に、非標準の堅牢性の低い方法で(カスタム)ビューで同じことを達成できます。

67
Nikolay Elenkov

フラグメントは、よりモジュール化されたアクティビティデザインを可能にする、アクティビティに配置できるアプリケーションのユーザインタフェースまたは動作の一部です。フラグメントが一種のサブアクティビティであると言っても間違いではありません。

以下はフラグメントに関する重要な点です。

  1. フラグメントには独自のレイアウトと独自のライフサイクルコールバックを持つ独自の動作があります。

  2. アクティビティの実行中にアクティビティ内のフラグメントを追加または削除できます。

  3. 単一のアクティビティで複数のフラグメントを組み合わせて、マルチペインUIを構築できます。

  4. フラグメントは複数のアクティビティで使用できます。

  5. フラグメントのライフサイクルは、そのホストアクティビティのライフサイクルと密接に関連しています。

  6. アクティビティが一時停止されると、そのアクティビティで利用可能なすべてのフラグメントも停止されます。

  7. フラグメントは、ユーザーインターフェイスコンポーネントを持たない動作を実装できます。

  8. フラグメントは、APIバージョン11で Android 3 (Honeycomb)でAndroid APIに追加されました。

詳しくは公式サイトFragmentsをご覧ください。

44
mani

これは私がフラグメントで見つけた重要な情報です:

歴史的にAndroidアプリの各画面は別々のActivityとして実装されていました。 Android Intentメカニズムでは、アクティビティ間で参照型(つまりオブジェクト)を直接渡すことが許可されていないため、画面間で情報をやり取りする際に問題が生じます。代わりに、オブジェクトをシリアル化するか、グローバルにアクセス可能な参照を利用可能にする必要があります。

各スクリーンを別々のフラグメントにすることで、このデータ通過の頭痛が完全に回避されます。フラグメントは常に特定のアクティビティのコンテキスト内に存在し、常にそのアクティビティにアクセスできます。アクティビティ内に関心のある情報を格納することによって、各画面のフラグメントは、アクティビティを通じてオブジェクト参照に簡単にアクセスできます。

ソース: https://www.pluralsight.com/blog/software-development/Android-fragments

16
Kaveesh Kanwal

フラグメントは、すべてのページでナビゲーションドロワーを維持したい場合など、特に便利です。あなたが欲しいどんな断片でもフレームレイアウトを膨らませることができて、それでもナビゲーション引き出しにアクセスすることができます。

アクティビティを使用したことがある場合は、引き出しをすべてのアクティビティで保持しなければならず、冗長なコードになります。これはフラグメントの興味深い使い方の1つです。

私はAndroidの初心者ですが、それでもフラグメントがこの方法で役立つと思います。

7
Nithin Baby

私はこれが死についてすでに議論されていることを知っています、しかし私はもう少しポイントを加えたいと思います:

  • フラグはMenusを生成するために使用することができ、MenuItemクリックを自分で処理することができます。このようにあなたの活動のためのさらなる変調オプションを与えます。あなたのアクティビティがそれを知らなくてもContextualActionBarなどを行うことができ、基本的にあなたのアクティビティが扱う基本的なもの(ナビゲーション/設定/情報)から切り離すことができます。

  • 子の断片を持つ親の断片は、コンポーネントをモジュール化するためのさらなるオプションを提供します。例えば。あなたは簡単にFragsを入れ替えたり、Pagerの中に新しいFragsを入れたり、削除したり、並べ替えたりすることができます。あなたの活動がそれについて何かを知ることなしにすべてはただより高いレベルのものに焦点を合わせています。

4
einschnaehkeee

アクティビティはツールバーの付いたアプリの全画面コンポーネントです。それ以外のものはすべてフラグメントであることが望ましいです。ツールバーを使用した1つのフルスクリーンの親アクティビティには、複数のペイン、スクロール可能なページ、ダイアログなど(すべてのフラグメント)を含めることができ、それらすべてに親からアクセスして親を介して通信できます。

例:

活動A、活動B、活動C:

  • すべてのアクティビティは、たとえば基本的なツールバーを表示するため、または親アクティビティから継承するために同じコードを繰り返す必要があります(管理が面倒になります)。
  • あるアクティビティから別のアクティビティに移動するには、それらのすべてがメモリ内にある(オーバーヘッド)か、一方が他方を開くために破棄される必要があります。
  • 活動間のコミュニケーションはインテントを介して行うことができます。

vs

活動A、フラグメント1、フラグメント2、フラグメント3:

  • コードの繰り返しはありません。すべての画面に、その1つのアクティビティからのツールバーなどがあります。
  • あるフラグメントから次のフラグメントに移動するためのいくつかの方法 - ビューページャー、マルチペインなど.
  • アクティビティにはほとんどのデータが含まれているため、フラグメント間の通信は最小限で済みます。それでも必要な場合は、インターフェースを介して簡単に行うことができます。
  • フラグメントは、フルスクリーンである必要はなく、それらを設計する際に多くの柔軟性があります。
  • ビューが不要な場合は、フラグメントによってレイアウトを拡大する必要はありません。
  • 複数のアクティビティが同じフラグメントを使用できます。

フラグメントはアクティビティ内にあります。

活動はそれ自身の上に生きている間。

0
superkytoz

フラグメントはアクティビティ内にあり、次のものがあります。

  • それ自身のライフサイクル
  • 独自のレイアウト
  • 独自の子フラグメントなど.

Fragmentsは、それが属するメインアクティビティのサブアクティビティと考えてください。それ自体は存在できず、何度も何度も呼び出したり再利用したりすることができます。お役に立てれば :)

0
maniix

1.フラグメントを使用する目的は?

  • Ans:
    1. デバイスのフォームファクタの違いに対処する.
    2. アプリ画面間で情報をやり取りする。
    3. ユーザーインターフェースの構成.
    4. 高度なUIメタファ.
0