2012-02-15 4 views
8

これについてはかなりの質問がありましたが、Androidで従来のModel-View-Controllerデザインパターンを実装するときに、どのクラスでどのような役割を果たさなければならないのか理解していませんか?MVCでのアクティビティクラスの役割は何ですか?

私はコントローラでなければならないと感じていますが、これはUIスクリーン(1つの画面にActivityがなければならないため)とコントローラーの間に1対1の関係があり、MVCの緩やかな結合のポイント異なるコンポーネント。

+0

[これは既に見たと思うでしょう]](http://stackoverflow.com/q/2925054/593709) –

+0

はい私は持っています:)それは関連する回答には1つのコメントしかありません。 http://stackoverflow.com/a/2925368/824903、それは基本的に "AndroidはMVCをしません"と言います。私はこの問題をより明確にすることを望んでいました。 – donturner

答えて

7

あなたは正しいです。 xmlインタフェースはの表示と定義され、他のクラスのデータはのモデルとして扱うことができます。

アクティビティはビューからすべてのイベントとユーザ入力を受け取りますので、コントローラと簡単に言います。

しかし、のは明確にしましょう、それは完璧ではない(それは本当に存在するのでしょうか?)MVC

は、より具体的に受け入れ答えの最初のコメントをthis questionに見てください、そして、それは

+0

したがって、基本的にAndroidはMVCを「そのまま」使用しませんか? – donturner

+0

一方で、アンドロイドのSDKは、あなたのアプリのさまざまなレイヤーを分けることができます。一方、アクティビティのコードで直接ビューを構築することができます。だからはいAndroidはMVCを実装させることができますが、それはパターンの厳密なアプリケーションではありません。私はデザインパターンのエキスパートではないので、他の誰かが私よりも優れていることを明確にすることができます:) – grunk

1
有用である可能性があります

アクティビティは有能なコントローラを作ることができ、フラグメントを使って階層MVCを実装することもできます。最も厳しいフレームワークでさえ、まだdo crazy thingsの方法を見つけることができるので、MVCの仕事をすることはプログラマに任されています。

-1

Androidは優れたアーキテクチャを備えておらず、MVCデザインパターンに従っていません。

MVCでアクティビティをコンセプトする最も良い方法は、画面の回転やロケールの変更など、設定が変更されるたびに破棄され、その状態がすべて失われるため、ビュー(一部のコントローラロジック)です。

この場合のコントローラは、アクティビティコンテキスト外のコードからビュー(アクティビティとそのGUIコンポーネント)にアクセスするブリッジなので、Applicationオブジェクトになります。特定の時間にApplicationオブジェクトが1つだけ存在するようにシングルトンを使用する必要があります。そうしないと、プロセスごとに1つのApplicationオブジェクトが存在します。 Applicationオブジェクトは、ライフサイクルがアクティビティのライフサイクルから切り離されているため、モデルを格納するのに適していません。アクティビティのライフサイクルの任意のポイント(アプリケーションがバックグラウンドにある間)で再起動されずに破棄され、再作成され、onCreate()メソッド内で割り当てられていない変数および参照はすべてnullになります。

したがって、モデルは、アクティビティにリンクされたsetRetainInstance(true)を持つGUIレス、ヘッドレスのフラグメントに格納する必要があり、アクティビティを再作成するたびにモデルを再接続する必要があります。フラグメントマネージャを使用して、保持されているフラグメントを確実にリカバリし、それを新たに作成しないようにする必要があります。これはバックグラウンドタスクを実行するのに最適な場所ですが、Applicationオブジェクトで実行することもできます。アクティビティに対してタスクを実行することは決してありません。構成の変更に伴って破壊されるためです。

0

私は、ビューをXMLとして定義することで混乱が生じる可能性があるので、アクティビティはビューであると誤解されています。そうではありません。アクティビティにビュー(XMLレイアウト)を渡すと、XMLレイアウトに含まれるビューが膨らみます。また、データ(モデル)をビュー(EditText、TextView、拡張ビューのベースビューなど)に渡します。

本当にMVCが必要な場合は、XMLレイアウトでビューを設定するだけで、ルートビューから拡張されたビューオブジェクト(RelativeLayoutがそこから拡張されている場合)を作成できます。そこから、そのビューに必要なアクセサメソッドと異なるロジックを追加します。次に、その周辺のユニットテストを追加できます。活動に

あなたはもはやレイアウトのIDを渡しません、代わりにこのようなものでしょう:もちろん

CustomView customView = new CustomView(...); 
setContentView(customView); 
... 

を、ほぼすべてのアプリケーションは、これをしないとあなたが本当に必要はありません。これをする。 findViewByIdを呼び出すだけで、そのビュー・オブジェクトにリンクし、そのビュー・オブジェクトを呼び出すことができます。私の考えではMVCです。

関連する問題