Шаблон MVC на Android - PullRequest
490 голосов
/ 28 мая 2010

Возможно ли реализовать шаблон модель-представление-контроллер в Java для Android?

Или это уже реализовано через Активности? Или есть лучший способ реализовать шаблон MVC для Android?

Ответы [ 21 ]

236 голосов
/ 28 мая 2010

В Android у вас нет MVC, но у вас есть следующее:

  • Вы определяете свой пользовательский интерфейс в различных файлах XML по разрешению, оборудованию и т. Д.
  • Вы определяете свои ресурсы в различных XML-файлах по локали и т. Д.
  • Вы расширяете выражения типа ListActivity , TabActivity и используете файл XML с помощью inflaters .
  • Вы можете создать столько классов, сколько пожелаете для своей бизнес-логики.
  • Для вас уже написано много утилит - DatabaseUtils, Html.
224 голосов
/ 09 июня 2011

Универсально уникального паттерна MVC не существует. MVC - это концепция, а не основа программирования. Вы можете реализовать свой собственный MVC на любой платформе. Пока вы придерживаетесь следующей основной идеи, вы реализуете MVC:

  • Модель: Что визуализировать
  • Просмотр: Как сделать
  • Контроллер: События, пользовательский ввод

Также подумайте об этом следующим образом: когда вы программируете свою модель, модель не должна беспокоиться о рендеринге (или коде, специфичном для платформы). Модель сказала бы представлению, мне все равно, будет ли ваш рендеринг Android, iOS или Windows Phone, это то, что вам нужно для рендеринга. Представление будет обрабатывать только код рендеринга для конкретной платформы.

Это особенно полезно, когда вы используете Mono для совместного использования модели для разработки кроссплатформенных приложений.

47 голосов
/ 28 мая 2010

Действия, представления и действия на Android представляют собой упрощенный способ работы с пользовательским интерфейсом Android и представляют собой реализацию шаблона модель-представление-представление-модель (MVVM) , который структурно похож в том же семействе, что и) модель – вид – контроллер.

Насколько мне известно, нет способа вырваться из этой модели. Возможно, это можно сделать, но вы, вероятно, потеряете все преимущества существующей модели, и вам придется переписать свой собственный слой пользовательского интерфейса, чтобы он работал.

28 голосов
/ 20 апреля 2012

После некоторого поиска наиболее разумным ответом будет следующее:

MVC уже реализован в Android как:

  1. View = макет, ресурсы и встроенные классы, такие как Button, полученные из android.view.View.
  2. Контроллер = Активность
  3. Модель = классы, которые реализуют логику приложения

(Это, кстати, не подразумевает никакой логики предметной области в деятельности.)

Самое разумное для маленького разработчика - следовать этой схеме, а не пытаться делать то, что Google решил не делать.

PS Обратите внимание, что активность иногда перезапускается, поэтому для данных модели нет места (самый простой способ вызвать перезапуск - это пропустить android:configChanges="keyboardHidden|orientation" из XML и включить ваше устройство).

EDIT

Мы можем говорить о MVC , но это будет так сказать FMVC , Framework - Модель - Представление - Контроллер . Framework (ОС Android) навязывает свое представление о жизненном цикле компонентов и связанных событиях, и на практике контроллер (Activity / Service / BroadcastReceiver) является первым всех ответственных за решение этих событий, связанных с Framework (например, onCreate () ). Должен ли пользовательский ввод обрабатываться отдельно? Даже если это так, вы не можете отделить его, события пользовательского ввода также приходят из Android.

В любом случае, чем меньше кода, который не является специфичным для Android, вы добавляете в Activity / Service / BroadcastReceiver, тем лучше.

18 голосов
/ 28 мая 2010

Нет единого паттерна MVC, которому вы могли бы подчиниться.MVC просто более или менее заявляет, что вы не должны смешивать данные и представление, так что, например, представления отвечают за хранение данных, или классы, которые обрабатывают данные, непосредственно влияют на представление.

Но, тем не менее, способ работы Androidклассы и ресурсы, иногда вы даже вынуждены следовать шаблону MVC.На мой взгляд, более сложными являются действия, которые иногда отвечают за представление, но, тем не менее, одновременно выполняют роль контроллера.

Если вы определяете свои представления и макеты в файлах XML, загрузите свои ресурсы изres, и если вы избегаете более или менее смешивать эти вещи в своем коде, то вы все равно следуете шаблону MVC.

14 голосов
/ 09 марта 2012

Лучший ресурс, который я нашел для реализации MVC на Android, - этот пост :

Я следовал тому же дизайну для одного из моих проектов, и он работал отлично. Я новичок в Android, поэтому не могу сказать, что это лучшее решение.

Я сделал одну модификацию: я создал модель и контроллер для каждого действия в классе приложения, чтобы они не воссоздались при изменении режима альбомной ориентации.

14 голосов
/ 03 июня 2015

Вы можете реализовать MVC в Android, но он не «изначально поддерживается» и требует некоторых усилий.

Тем не менее, я лично склоняюсь к MVP как к более чистому архитектурному шаблону для разработки под Android. И, говоря MVP, я имею в виду это:

enter image description here

Я также опубликовал более подробный ответ здесь .

После игры с различными подходами к реализации MVC / MVP в Android, я пришел к разумному архитектурному шаблону, который я описал в этом посте: Архитектурные шаблоны MVP и MVC в Android .

12 голосов
/ 03 августа 2011

Я согласен с JDPeckham и считаю, что одного XML недостаточно для реализации части пользовательского интерфейса приложения.

Однако, если вы рассматриваете Activity как часть представления, реализация MVC довольно проста. Вы можете переопределить Приложение (как возвращено getApplication () в Activity), и именно здесь вы можете создать контроллер, который выживет в течение всего времени жизни вашего приложения.

(В качестве альтернативы вы можете использовать шаблон синглтона, как предлагается в документации приложения)

11 голосов
/ 28 августа 2010

Создание пользовательского интерфейса Android с использованием макетов, ресурсов, действий и намерений является реализацией шаблона MVC. Пожалуйста, смотрите следующую ссылку для получения дополнительной информации об этом - http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf

зеркало для pdf

10 голосов
/ 13 июля 2015

MVC - архитектура на Android Лучше следовать любому MVP вместо MVC в Android. Но все же согласно ответу на вопрос это может быть решение

Enter image description here

Описание и рекомендации

     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.: Если ваша деятельность представляет несколько моделей, то вместо написания кода / логики в деятельности лучше разделить представления на фрагменты. Тогда лучше. Поэтому в будущем, если для отображения в представлении потребуется еще какая-то модель, добавьте еще один фрагмент.

ПРИМЕЧАНИЕ 3: Разделение кода очень важно. Каждый компонент в архитектуре должен быть независимым, не иметь зависимой логики. Если случайно, если у вас есть что-то зависимая логика, то напишите класс логики отображения между ними. Это поможет вам в будущем.

...