188

はじめに:

基本的な「フラグメント チュートリアル」のパターンは次のようになります。

  1. タブレットでは、左側にリスト、右側に詳細があります。
  2. 両方あり Fragments、両方とも同じに存在しますActivity
  3. 電話では、リストFragmentを 1 つにまとめActivityます。
  4. Activity詳細で新しいを起動しFragmentます。

(例: Android 3.0 Fragments API by Dianne HackbornおよびFragments API Guide )

どちらのデバイスでも、機能は にありFragmentsます。(単純)

タブレットではアプリ全体が1Activityですが、スマートフォンでは多数Activitiesあります。


質問:

  • 電話アプリを複数に分割する理由はありActivitiesますか?

この方法の問題点の1 つは、メインの Tabletと別の Phone で多くのロジックを複製することです。ActivityActivities

  • Fragmentsどちらの場合も 1 アクティビティ モデルを保持し、同じロジックを使用して (レイアウトを変えるだけで) 切り替える方が簡単ではないでしょうか?

このように、ほとんどのロジックはFragmentsそれ自体に存在し、Activityコードの重複は 1 つだけです。

また、私が について読んだことは、代わりに でActionBarSherlock最もうまく機能するように見えるということです(ただし、まだ使用していません)。FragmentsActivities

チュートリアルは単純化しすぎていませんか?それとも、このアプローチで重要なことを見逃していませんか?


私たちはオフィスで両方のアプローチを成功裏に試しましたが、私はより大きなプロジェクトを開始しようとしており、物事をできるだけ簡単にしたいと考えています.

関連する質問へのリンク:


アップデート

質問の報奨金を開始しました-タブレットのアクティビティと各電話のアクティビティでアプリのロジックを複製する必要がある理由についてまだ確信が持てません。

また、Square の関係者による興味深い記事を見つけました。これは読む価値があります。

4

5 に答える 5

42

チュートリアルが非常に単純化されていることに同意します。彼らは紹介するFragmentsだけですが、提案されたパターンには同意しません。

また、アプリのロジックを多くのアクティビティで複製することはお勧めできないことにも同意します (ウィキペディアの DRY 原則を参照してください)。


ActionBarSherlock私は、 Fragments Demo アプリで使用されているパターンを好みます (ダウンロードはこちらソース コードはこちら)。質問で言及されているチュートリアルに最も近いデモは、アプリの「レイアウト」と呼ばれるものです。またはFragmentLayoutSupportソースコードで。

このデモでは、ロジックが から に移動さActivityれていFragmentます。実際には、フラグメントを変更するためのTitlesFragmentロジックが含まれています。このように、各アクティビティは非常にシンプルです。ロジックがアクティビティ内にない非常に単純なアクティビティを多数複製すると、非常に単純になります。

ロジックを Fragments に入れることで、コードを何度も書く必要がなくなります。フラグメントが配置されているアクティビティに関係なく使用できます。これにより、基本チュートリアルで提案されたパターンよりも強力なパターンになります。

    /**
    * Helper function to show the details of a selected item, either by
    * displaying a fragment in-place in the current UI, or starting a
    * whole new activity in which it is displayed.
    */
    void showDetails(int index)
    {
        mCurCheckPosition = index;

        if (mDualPane)
        {
            // We can display everything in-place with fragments, so update
            // the list to highlight the selected item and show the data.
            getListView().setItemChecked(index, true);

            // Check what fragment is currently shown, replace if needed.
            DetailsFragment details = (DetailsFragment) getFragmentManager()
                .findFragmentById(R.id.details);
            if (details == null || details.getShownIndex() != index)
            {
                // Make new fragment to show this selection.
                details = DetailsFragment.newInstance(index);

                // Execute a transaction, replacing any existing fragment
                // with this one inside the frame.
                FragmentTransaction ft = getFragmentManager()
                    .beginTransaction();
                ft.replace(R.id.details, details);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.commit();
            }

        }
        else
        {
            // Otherwise we need to launch a new activity to display
            // the dialog fragment with selected text.
            Intent intent = new Intent();
            intent.setClass(getActivity(), DetailsActivity.class);
            intent.putExtra("index", index);
            startActivity(intent);
        }
    }

ABSパターンのもう 1 つの利点は、多くのロジックを含む Tablet アクティビティに終わらないことです。つまり、メモリを節約できます。チュートリアル パターンは、より複雑なアプリで非常に大きなメイン アクティビティにつながる可能性があります。いつでも配置されるすべてのフラグメントのロジックを処理する必要があるためです。

全体として、多くのアクティビティを使用することを余儀なくされているとは考えないでください。コードを多くのフラグメントに分割する機会があり、それらを使用するときにメモリを節約できると考えてください。

于 2012-09-21T10:06:46.277 に答える
18

あなたは正しい軌道に乗っていると思います。(そして、はい、チュートリアルは単純化されすぎています)。

タブレット レイアウトでは、単一のアクティビティを使用して、フラグメントを (複数の「ペイン」で) スワップ インおよびスワップ アウトできます。電話レイアウトでは、フラグメントごとに新しいアクティビティを使用できます。

そのようです:

ここに画像の説明を入力

余計な作業のように思えるかもしれませんが、電話に複数のアクティビティを使用することで、基本的なアクティビティのライフサイクルとインテントの受け渡しを有効にします。これにより、フレームワークがすべてのアニメーションとバックスタックを処理できるようになります。

コードを減らすために、 a を使用してBaseActivity、そこから拡張できます。

したがって、ユーザーがタブレットを持っている場合は、あなたが使用するMyMultiPaneFragActivityか、または同様のものを使用します。このアクティビティは、フラグメントからのコールバックを管理し、インテントを正しいフラグメント (検索インテントなど) にルーティングします。

ユーザーが電話を持っている場合、通常のアクティビティをごくわずかなコードで使用して、それを拡張しMyBaseSingleFragActivityたり、同様のものを作成したりできます。これらのアクティビティは、5 ~ 10 行 (場合によってはそれ以下) の非常に単純なコードです。

注意が必要なのは、インテントのルーティングなどです。*(編集:以下を参照)。

これが推奨される方法である理由は、メモリを節約し、複雑さと結合を減らすためだと思います。フラグメントを交換する場合FragmentManager、バックスタックのフラグメントへの参照が維持されます。また、ユーザーにとって何が「実行中」であるべきかを簡素化します。このセットアップは、アクティビティのライフサイクルから Fragment のビューとレイアウトとロジックも分離します。このようにして、フラグメントは単一のアクティビティに存在したり、別のフラグメント (2 ペイン) と並んで存在したり、3 ペインのアクティビティに存在したりできます。

*通常のインテント ルーティングを使用する利点の 1 つは、バックスタックのどこからでもアクティビティを明示的に起動できることです。一例として、検索結果が挙げられます。(MySearchResults.class)。

詳細については、こちらをご覧ください。

http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html

各フラグメントは別々のアクティビティ間で適切に機能する必要があるため、多少前もっての作業になるかもしれませんが、通常は効果があります。これは、さまざまなフラグメントの組み合わせを定義する代替レイアウト ファイルを使用し、フラグメント コードをモジュラーに保ち、アクション バーの管理を簡素化し、バック スタックのすべての作業をシステムに処理させることができることを意味します。

于 2012-09-11T07:14:11.080 に答える
6

これは、Udacity の Android Fundamentals コースのこのビデオから取られた、同じことに関する Reto Meier の回答です。

アプリをさまざまなアクティビティに分割したほうがよい理由はいくつかあります。

  • 単一のモノリシック アクティビティを使用すると、コードの複雑さが増し、読み取り、テスト、および保守が困難になります。
  • インテント フィルタの作成と管理が非常に難しくなります。
  • 独立したコンポーネントが密結合するリスクが高まります。
  • 1 つのアクティビティに機密情報と安全に共有できる情報の両方が含まれている場合、セキュリティ リスクが発生する可能性が高くなります。

経験則として、コンテキストが変更されるたびに新しいアクティビティを作成することをお勧めします。たとえば、別の種類のデータを表示していて、データの表示から入力に切り替えているときなどです。

于 2015-05-14T05:32:58.370 に答える
4

この方法の問題点の 1 つは、メインの Tablet アクティビティと別の Phone アクティビティで多くのロジックを複製することです。

マスター/ディテール パターンには、2 つのアクティビティがあります。1 つは、大きな画面に両方のフラグメントを表示し、小さな画面に「マスター」フラグメントのみを表示します。もう 1 つは、小さな画面に「詳細」フラグメントを表示します。

詳細ロジックは、詳細フラグメントに結び付ける必要があります。したがって、アクティビティ間で詳細ロジックに関連するコードの重複はありません。詳細アクティビティは詳細フラグメントを表示するだけで、おそらくIntentエクストラからデータを渡します。

また、ActionBarSherlock について私が読んだことは、Activity ではなく Fragments で最もうまく機能するようだということです (ただし、まだ使用していません)。

ActionBarSherlock はネイティブ アクション バーの純粋なバックポートであるため、ActionBarSherlock はネイティブ アクション バーと同様にフラグメントとは関係ありません。

于 2012-09-24T12:30:42.423 に答える
0

「電話アプリを多くのアクティビティに分割する理由はありますか?」の最初の質問を参照してください。- はい。タブレットは開発者により多くのスペースを提供するため、開発者は 1 つの画面により多くを配置できます。Android は、Activities が screen を提供できることを教えてくれます。したがって、タブレットの 1 つの大画面でできることは、すべてのフラグメントを表示するのに十分なスペースがないため、携帯電話の複数の画面に分散する必要がある場合があります。

于 2015-05-24T10:31:22.937 に答える