AndroidのMVCパターン


497

AndroidのJavaでモデル、ビュー、コントローラーのパターンを実装することは可能ですか?

それとも、アクティビティによってすでに実装されていますか?または、AndroidにMVCパターンを実装するより良い方法はありますか?


64
あなたの質問はとても良いです。しかし、解決策としてマークされた答えは私の意見では正しくありません。それは数人の人々を誤解させるかもしれません。
Saghar、2014年

4
ここから私の2つの投稿をチェックしてください。Androidアーキテクチャ:MV?
ドリ

1
また、MVCに準拠するために従うべき追加のルールセットはありますか、またはアクティビティ、XML、リソースのためにAndroid開発はすでにMVCに合わせて調整されていますか?
ウドゥンの炎

3
@Dori、リンクを修正しました:Androidアーキテクチャ:MV?
Andreybeta 2017年

この記事は、実際の例を通じて、AndroidのMVCを探しているものと完全
Ali Nem

回答:


239

AndroidにはMVCはありませんが、次のものがあります。


3
@JDPekham、なぜ「レイアウト/ビューと対話しないとアクティビティをインスタンス化できない」と言うのですか?アクティビティをインスタンス化するためにビューと話す必要はありません。実際、ビューと話すことは決してアクティビティのインスタンス化の一部ではありません。必要に応じて、ビューとやり取りするさまざまなActivityメソッドを呼び出すことができます(必須ではありません)。2番目の質問:アクティビティが「コントローラー」の役割を担うことを想定している(多くのAndroid開発者がそのように考えていると思います)ため、アクティビティからの見解を話してみませんか?

8
「AndroidはMVC」と言った人は、Backbone.js(はい、クライアント側のjs)を1週間試してから、「AndroidはMVC」と言ってください。あなたはついに質問となぜ私たちが尋ね続けるのかを理解するでしょう:)
マーク・ピーターソン

14
「AndroidではMVCがありません」???? Androidでは、他の言語と同様に、MVCが必要な場合はMVCを使用します。
Lorenzo Barbagli 2015年

1
@LorenzoBarbagli彼は、Androidは意図的にアプリにMVCを強制しないことを意味します(iOSはそうです)。MVCが提供するもの、つまり懸念事項の分離と簡単にテストできる分離されたモデルを実現したい場合は、MVC、MVPなどのフレーバーを自分で実装する必要があります。
Piovezan

いいえ。Androidには確実にMVCがありますが、より暗黙的にあります。Androidがすべてを構造化する方法に従って、異なる方法で実装されています。
6rchid

229

普遍的にユニークなMVCパターンはありません。MVCは、堅固なプログラミングフレームワークというよりはコンセプトです。独自のMVCを任意のプラットフォームに実装できます。次の基本的な考え方に固執する限り、MVCを実装しています。

  • モデル:何をレンダリングするか
  • 表示:レンダリング方法
  • コントローラー:イベント、ユーザー入力

また、このように考えてください。モデルをプログラムするとき、モデルはレンダリング(またはプラットフォーム固有のコード)について心配する必要はありません。モデルはビューに対して言うでしょう、あなたのレンダリングがAndroidかiOSかWindows Phoneかは気にしません、これは私があなたにレンダリングする必要があるものです。ビューは、プラットフォーム固有のレンダリングコードのみを処理します。

これは、クロスプラットフォームアプリケーションを開発するためにMonoを使用してモデルを共有する場合に特に便利です。


12
それは真実であり、十分に言えば、これは理論であり、人々は実用的です!
TWiStErRob 2013年

1
@TWiStErRobしかし、設計パターンは理論的で抽象的なアイデアであり、それらを実現する方法が1つだけではありません。「理論的にはMVCを理解したくないので、実装したいだけだ」と宣言すると、「洗濯機がCleaner™パターンを実装しているので、キッチンに洗濯機を置くつもりです」という結果になる可能性があります。そしてキッチンにはそれが必要です。」
ルーク、

1
他の人が思いついたことを示す例は非常に貴重だと思います。それらを改善し、彼らの努力から学ぶことができます。誰もが車輪を再発明する必要はありません。Androidとその複雑なライフサイクルのコンテキストでは、デザインパターンでは対処されない問題がありますが、誰もがそれに直面します。これが私が実践的に言っていることです。
TWiStErRob 2018

47

Androidのアクション、ビュー、およびアクティビティは、Android UIを操作するための組み込みの方法であり、モデル-ビュー-ビューモデル(MVVM)パターンの実装であり、モデル-ビュー(同じファミリー内)と構造的に類似しています-コントローラ。

私の知る限りでは、このモデルから抜け出す方法はありません。それはおそらく可能ですが、既存のモデルが持つすべての利点を失う可能性があり、それを機能させるために独自のUIレイヤーを書き直す必要があります。


29

いくつか検索した後、最も合理的な答えは次のとおりです。

MVCはすでにAndroidに次のように実装されています。

  1. ビュー=レイアウト、リソース、および組み込みのようなクラスButtonから派生android.view.View
  2. コントローラー=アクティビティ
  3. モデル=アプリケーションロジックを実装するクラス

(ちなみに、これはアクティビティにアプリケーションドメインロジックがないことを意味します。)

小規模な開発者にとって最も合理的なことは、このパターンに従い、Googleがしないと決めたことをしようとしないことです。

PSアクティビティは時々再起動されるので、モデルデータを置く場所がないことに注意してください(再起動を引き起こす最も簡単な方法はandroid:configChanges="keyboardHidden|orientation"、XML から省略してデバイスをオンにすることです)。

編集

私たちはMVCについて話しているかもしれませんが、FMVCFramework--Model--View--Controllerと言えますフレームワーク(アンドロイドOS)は、コンポーネントのライフサイクルと関連イベントのその考えを課し、そして実際にコントローラーActivity/ Service/ BroadcastReceiver)これらに対応するための責任がすべての最初のあるフレームワークは、(のようなイベント-imposed のonCreate()を)。ユーザー入力は個別に処理する必要がありますか?たとえそうであっても、分離することはできません。ユーザー入力イベントもAndroidから送信されます。

とにかく、Android固有ではないコードをActivity/ Service/ に挿入する回数が少ないほどBroadcastReceiver、優れています。


3
アクティビティはUIに直接アクセスできますが、MVCではコントローラーはビューを認識できません(その逆のみ)。
Konrad Morawski、2014

2
@KonradMorawskiうーん.... 物事の表示コントローラーについて知っているビューコントローラーのことを知っている子は?ビューは物事を表示することだけを知っている方がより論理的です。そして、モデルはデータの性質のみを知っていることを考慮に入れると、コントローラが必要なのはこのためです。モデルビューの両方について知っている必要がありますButton
18446744073709551615 2014

4
当然のことながら、ビューは、イベントをコントローラーに委譲するために、コントローラーについて知る必要があります。コントローラはそれをモデルまで追跡し、結果を(表示できるように)ビューに通知します。コントローラーはビューを膨らませません(Activityが行うのに対し)、ボタン、テキストボックス、リストなどについて(Activityは知っています)。
Konrad Morawski、2014

1
Serviceコントローラーも傘下に入ると思います
CL22 2014

1
オブザーバーのことを聞いたことがありますか?これまでに見つかった最良の分離Ivは、1。コントローラーにモデルインスタンスのみがある、2。モデルにコントローラーまたはビューの知識がないが、ビューはモデルオブザーバーとして登録できる(そのため、モデルはビューについてはある程度知っているが、それが誰であるかを知らず、気にしない)-モデルがデータの読み込みを完了すると、すべてのオブザーバー(通常は1)に通知します。3。ビューにはモデルインスタンスのみがあり、そこからデータを引き出します。この方法では、すべてのMVCフレームワークに2つの依存関係しかありません。2が最小だと思うので、最適なレイアウトにする必要があります。
Srneczek 2015

18

従うことができる単一のMVCパターンはありません。MVCは多かれ少なかれ、データとビューを混ぜてはならないことを述べているので、たとえばビューはデータを保持する責任があるか、データを処理しているクラスがビューに直接影響を与えています。

それにもかかわらず、Androidがクラスとリソースを処理する方法では、MVCパターンに従うことを余儀なくされることさえあります。私の意見ではさらに複雑なのは、ビューに責任があることもありますが、同時にコントローラーとして機能するアクティビティです。

XMLファイルでビューとレイアウトを定義し、resフォルダーからリソースをロードし、コード内でこれらの要素を混同しないようにする場合は、とにかくMVCパターンに従っていることになります。


14

AndroidにMVCを実装できますが、「ネイティブでサポート」されておらず、多少の努力が必要です。

とは言っても、私は個人的にはAndroid開発のアーキテクチャパターンとしてよりクリーンなMVPを好む傾向があります。そして、MVPと言うことで、私はこれを意味します:

ここに画像の説明を入力してください

ここにも詳細な回答を掲載しています

AndroidでのMVC / MVP実装へのさまざまなアプローチを試した後、私はこの投稿で説明した合理的なアーキテクチャパターンを思いつきました。MVPとMVCのアーキテクチャパターンin Androidです。


14

AndroidにMVCを実装するために見つけた最高のリソースはこの投稿です。

私は自分のプロジェクトの1つに同じデザインを採用しましたが、うまくいきました。私はAndroidの初心者なので、これが最良のソリューションであるとは言えません。

変更を1つ加えました。アプリケーションクラスの各アクティビティのモデルとコントローラーをインスタンス化して、横向き/縦向きモードが変更されたときにこれらが再作成されないようにしました。


8
記事が1日削除された場合に備えて、要約を取得すると便利です。
pqsk 2013

12

私はJDPeckhamに同意します。アプリケーションのUI部分を実装するには、XMLだけでは十分ではないと思います。

ただし、アクティビティをビューの一部と見なす場合、MVCの実装は非常に簡単です。Applicationを(ActivityのgetApplication()によって返されるように)オーバーライドでき、アプリケーションの存続期間中存続するコントローラーを作成できます。

(または、アプリケーションのドキュメントで提案されているシングルトンパターンを使用できます)


12

Androidでの MVC アーキテクチャAndroidのMVCではなく、MVPをフォローする方が良いです。しかし、質問への回答によれば、これは解決策になる可能性があります

ここに画像の説明を入力してください

説明とガイドライン

     Controller -
        Activity can play the role.
        Use an application class to write the
        global methods and define, and avoid
        static variables in the controller label
    Model -
        Entity like - user, Product, and Customer class.
    View -
        XML layout files.
    ViewModel -
        Class with like CartItem and owner
        models with multiple class properties
    Service -
        DataService- All the tables which have logic
        to get the data to bind the models - UserTable,
        CustomerTable
        NetworkService - Service logic binds the
        logic with network call - Login Service
Helpers -
        StringHelper, ValidationHelper static
        methods for helping format and validation code.
SharedView - fragmets or shared views from the code
        can be separated here

AppConstant -
        Use the Values folder XML files
        for constant app level

注1:

これがあなたにできる魔法のかけらです。コードを分類したら、IEntityやIServiceなどの基本インターフェイスクラスを記述します。一般的なメソッドを宣言します。次に、抽象クラスBaseServiceを作成し、独自のメソッドセットを宣言して、コードを分離します。

注2:アクティビティが複数のモデルを提示している場合は、アクティビティのコード/ロジックを作成するよりも、ビューをフラグメントに分割する方が適切です。その後、それはより良いです。したがって、将来、ビューに表示するためにさらにモデルが必要な場合は、フラグメントをもう1つ追加します。

注3:コードの分離は非常に重要です。アーキテクチャのすべてのコンポーネントは、依存するロジックを持たずに独立している必要があります。万が一依存するロジックがある場合は、その間にマッピングロジッククラスを記述します。これは将来的に役立ちます。


11

レイアウト、リソース、アクティビティ、インテントを使用したAndroid UIの作成は、MVCパターンの実装です。詳細については、次のリンクを参照してください-http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf

PDFのミラー


7
リンクが壊れている先生
ラット-TAT-TATレミーのおいしいレストラン

2
このCOSC346-lab2.2up.pdfファイルには完全な詳細が含まれていないようです。
ジェームズ2017

9

AndroidのMVCパターンは(種類の)アダプタークラスで実装されています。コントローラを「アダプタ」に置き換えます。アダプターの説明は次のとおりです。

Adapterオブジェクトは、AdapterViewとそのビューの基になるデータの間のブリッジとして機能します。

私はデータベースから読み取るAndroidアプリケーションについてこれを調べているだけなので、まだどの程度うまく機能するのかわかりません。ただし、QtのModel-View-Delegateアーキテクチャに少し似ているようで、従来のMVCパターンからのステップアップであると彼らは主張しています。少なくともPCでは、Qtのパターンはかなりうまくいきます。


9

この投稿は古いようですが、次の2つを追加して、Androidに関するこの領域の最近の開発についてお知らせします。

android-binding -Androidビューウィジェットのデータモデルへのバインディングを実現するフレームワークを提供します。AndroidアプリケーションにMVCまたはMVVMパターンを実装するのに役立ちます。

roboguice -RoboGuiceは、推測から解放されます。ビュー、リソース、システムサービス、またはその他のオブジェクトを挿入し、RoboGuiceに詳細を処理させます。


9

モデルビューコントローラー(MVC)

ここに画像の説明を入力してください


説明:

  • ソフトウェア開発で大規模なプロジェクトをメインにする必要がある場合、MVCはプロジェクトを組織化する普遍的な方法であるため、一般的に使用されます。
  • 新しい開発者はプロジェクトにすばやく適応できます
  • 大きなプロジェクトやクロスプラットフォームの開発にも役立ちます。

MVCパターンは基本的に次のとおりです。

  • モデル:何を表示するか。これはデータソースにすることができます(例:サーバー、アプリ内の生データ)
  • 表示:表示方法。これはxmlにすることができます。したがって、プレゼンテーションフィルターとして機能します。ビューはそのモデル(またはモデルパーツ)にアタッチされ、プレゼンテーションに必要なデータを取得します。
  • コントローラー:ユーザー入力のようなイベントの処理。これは活動です

MVCの重要な機能: モデル、ビュー、コントローラーのいずれかを変更できますが、他のモデルには影響しません

  • ビューの色、ビューのサイズ、またはビューの位置を変更するとします。そうすることで、モデルやコントローラに影響を与えません
  • (サーバーからデータをフェッチしてアセットからデータをフェッチするのではなく)モデルを変更するとしますが、それでもビューとコントローラーには影響しません
  • コントローラ(アクティビティのロジック)を変更するとします。モデルやビューには影響しません。

2
リレー情報をどのように表示/モデル化するための導管としてコントローラを使用したことがありません。私は、モデルとビューが互いに直接接触している方法に興味があります。この実装のソースまたは例はありますか?
Jacksonkr 2016

7

最も便利な簡略化された説明はここにあると思います:http : //www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf

私がここで見たり読んだりしたすべての他のものから、これらすべてのものを実装することは困難になり、Androidの他の部分とうまく適合しません。

アクティビティに他のリスナーを実装させることは、すでにAndroidの標準的な方法です。最も無害な方法は、スライドのようにJavaオブザーバーを追加して、onClickおよびその他のタイプのアクションをまだアクティビティ内にある関数にグループ化することです。

Androidの方法は、アクティビティが両方を行うことです。それと戦っても、将来のコーディングを拡張したり実行したりすることは本当に簡単にはなりません。

二番目の投稿に同意します。これは、人々が慣れ親しんでいる方法ではなく、すでに実装されているようなものです。同じファイルにあるかどうかにかかわらず、すでに分離されています。他の言語やOSに適合させるために追加の分離を作成する必要はありません。


6
あなたが提供したリンクは壊れています。
mmBs 2014年

6

ここの投稿のどれも質問に答えなかったのを見て驚いた。一般的すぎる、漠然とした、正しくない、またはAndroidでの実装に対応していない。

MVCでは、ビューレイヤーはユーザーインターフェイス(UI)の表示方法のみを認識します。これにデータが必要な場合は、モデルレイヤーから取得します。ただし、ビューはデータを見つけるようにモデルに直接要求するのではなく、コントローラーを介して行います。したがって、コントローラー  はモデルを呼び出して、ビューに必要なデータを提供します。データの準備ができると、コントローラーはデータをモデルから取得する準備ができたことをビューに通知します。これで、ビューモデルからデータを取得できます。

このフローは次のように要約できます。

ここに画像の説明を入力してください

ビューは 、コントローラー(パッシブMVCとも呼ばれ  ます)を介して、またはモデルにオブザーバブルを登録することでモデル内のデータを監視することによって、モデル内のデータの可用性を知ることができることに  注意してください。アクティブMVCです。

実装の部分で最初に頭に浮かぶのは、どのAndroidコンポーネントをViewに使用するべきかということです。Activity  またはFragment ?

答えはそれは問題ではなく、両方を使用できるということです。ビューは、 UIとのユーザの対話にデバイスと応答のユーザーインターフェイス(UI)を提示することができるはずです。両方Activity  とFragment  、このために必要なメソッドを提供します。

この記事で使用するアプリの例Activity では、Viewレイヤーに使用しましたが、使用するFragment  こともできます。

完全なサンプルアプリは、こちらの GitHubリポジトリの「mvc」ブランチにあります

ここでの例を通して、AndroidでのMVCアーキテクチャの長所と短所についても取り上げました

興味のある方のために、Androidアプリのアーキテクチャに関する一連の記事をここから始めました。そこでは、完全な動作するアプリを通じてAndroidアプリの開発のために、MVC、MVP、MVVMなどのさまざまなアーキテクチャを比較します。


私は、講師がアクティビティとフラグメントをビューとして使用してはなら、実際にはコントローラーである必要があり、ビューは別のファイルである必要があると講師が述べているアーキテクチャーコースを受講しました。これがあってはならない理由についての意見や理由はありますか?
brandonx

インストラクターはそれについて正確ではないと思います。コントローラーとしてアクティビティまたはフラグメントを選択することは、コントローラーにコンテキストを渡すことを意味します。一方、ビューには画面に描画するためのコンテキストも必要です。このように、つまりコントローラーにコンテキストを渡すと、アプリがメモリリークを起こしやすくなるため、コントローラーが状態を保持するべきではないと思います。
Ali Nem

5

AndroidでのMVx災害にうんざりしている私は最近、単方向のデータフローを提供し、MVCの概念に似た小さなライブラリを作成しました:https : //github.com/zserge/anvil

基本的に、コンポーネント(アクティビティ、フラグメント、およびビューグループ)があります。内部では、ビューレイヤーの構造とスタイルを定義します。また、データをビューにバインドする方法も定義します。最後に、リスナーを同じ場所にバインドできます。

次に、データが変更されると、グローバルな「render()」メソッドが呼び出され、ビューが最新のデータでスマートに更新されます。

コードのコンパクト化のためにすべてが内部にあるコンポーネントの例を次に示します(もちろん、モデルとコントローラーは簡単に分離できます)。ここで、「count」はモデル、view()メソッドはビュー、「v-> count ++」はボタンのクリックをリッスンしてモデルを更新するコントローラーです。

public MyView extends RenderableView {
  public MyView(Context c) {
      super(c);
  }

  private int count = 0;

  public void view() {
    frameLayout(() -> {              // Define your view hierarchy
      size(FILL, WRAP);
      button(() -> {
          textColor(Color.RED);      // Define view style
          text("Clicked " + count);  // Bind data
          onClick(v -> count++);     // Bind listeners
      });
    });
  }

分離したモデルとコントローラーを使用すると、次のようになります。

button(() -> {
   textColor(Color.RED);
   text("Clicked " + mModel.getClickCount());
   onClick(mController::onButtonClicked);
});

ここで各ボタンをクリックすると数が増加し、「render()」が呼び出され、ボタンのテキストが更新されます。

Kotlinを使用すると、構文がより快適になります:http : //zserge.com/blog/anvil-kotlin.html。また、ラムダを使用しないJavaの代替構文もあります。

ライブラリ自体は非常に軽量で、依存関係がなく、リフレクションを使用していません。

(免責事項:私はこのライブラリの作成者です)


4

Xamarinチームが説明した説明によると(iOS MVCで「奇妙なようですが、少しお待ちください」):

  • モデル(データまたはアプリケーションロジック)、
  • ビュー(ユーザーインターフェイス)、および
  • コントローラ(コードビハインド)。

私はこれを言うことができます:

Androidのモデルは、単にパーセル可能なオブジェクトです。ビューはXMLレイアウトで、コントローラーは(アクティビティ+そのフラグメント)です。

*これは私の意見であり、リソースや本からではありません。


4

実装されたMVCアーキテクチャはありませんが、MVP(モデル-ビュー-プレゼンター)アーキテクチャを実装するためのライブラリ/サンプルのセットが存在します。

以下のリンクを確認してください:

GoogleはAndroidアーキテクチャMVPの例を追加しました:


3

多くの人がMVCがすでにAndroidに実装されていると言っているのを見てきましたが、それは事実ではありません。デフォルトでは、AndroidはMVCに従いません。

私はGoogleがiPhoneのようなMVC実装の制限を強制的に課すことはないので、プロジェクトで必要なパターンまたは技術を開発者に委ねています。小規模または単純なアプリケーションでは、MVCの使用は必須ではありませんが、アプリケーションとして成長して複雑になり、後年にコードの変更が必要になると、AndroidでMVCパターンが必要になります。

コードを修正する簡単な方法を提供し、問題の削減にも役立ちます。AndroidにMVCを実装したい場合は、以下のリンクに従って、プロジェクトでMVC実装を楽しんでください。

http://www.therealjoshua.com/2011/11/android-architecture-part-1-intro/

しかし最近では、MVPとAndroid Architectural Patternは、開発者がクリーンで堅牢なAndroidアプリケーションに使用する最良のオプションの1つだと思います。


1
同意した。Androidには、自分をぶら下げるのに十分な柔軟性があります。そのアクティビティは、MVCの3つの側面すべてを処理するため、急速に巨大化および複雑化する可能性があります。
Scott Biggs 2014年

2

MVC、MVVM、またはプレゼンテーションモデルをAndroidアプリに適用する場合、私たちが本当に望んでいるのは、明確な構造化プロジェクトを用意し、ユニットテストをより簡単に行えるようにすることです。

現時点では、サードパーティのフレームワークがなければ、通常、ビジネス価値を追加しない多くのコード(addXXListener()、findViewById()など)があります。

さらに、通常のJUnitテストの代わりにAndroidユニットテストを実行する必要があります。これにより、実行に時間がかかり、ユニットテストがやや実用的でなくなります。これらの理由により、数年前にオープンソースプロジェクトであるRoboBinding -Androidプラットフォーム向けのデータバインディングプレゼンテーションモデルフレームワークを開始しました。

RoboBindingを使用すると、読み取り、テスト、保守が容易なUIコードを作成できます。RoboBindingは、addXXListenerなどの不要なコードの必要性をなくし、UIロジックをPOJOであり、通常のJUnitテストでテストできるプレゼンテーションモデルにシフトします。RoboBinding自体には、その品質を保証するために300を超えるJUnitテストが付属しています。


1

私の理解では、AndroidがMVCパターンを処理する方法は次のようになります。

コントローラーとして機能するアクティビティがあります。データを取得する責任があるクラス(モデル)があり、次にビューであるViewクラスがあります。

ビューについて話すとき、ほとんどの人はxmlで定義されたその視覚的な部分についてのみ考えます。ビューには、Javaクラスで定義されたコンストラクター、メソッドなどを備えたプログラムパーツがあることを忘れないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.