Шаблон MVC на Android

возможно ли реализовать шаблон model-view-controller в Java для Android?

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

21 ответов


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

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

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

  • модель: что оказываете
  • вид: как сделать

действия, представления и действия на Android являются запеченным способом работы с пользовательским интерфейсом Android и являются реализацией model-view-viewmodel (MVVM) pattern, который структурно подобен (в том же семействе, что и) model–view–controller.

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


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

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

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

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

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

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

редактировать

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

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


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

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

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


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

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

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


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

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

enter image description here

Я написал более подробный ответ!--10-->здесь.

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


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

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

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


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

зеркало для pdf


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: Разделение кода очень важно. Каждый компонент в архитектуре должен быть независимым, не имеющим зависимой логики. Если случайно, если у вас есть что-то зависимое логика, то напишите класс логики отображения между ними. Это поможет вам в будущем.


хотя этот пост кажется старым, я хотел бы добавить следующие два, чтобы сообщить о недавней разработке в этой области для Android:

android-привязка - формирование среды, enabes привязка вид Виджеты Android для модели данных. Это помогает реализовать шаблоны MVC или MVVM в приложениях android.

roboguice - RoboGuice принимает догадки из развития. Inject Your View, Ресурс, системная служба или любой другой объект, и пусть RoboGuice позаботится о деталях.


шаблон MVC Android (вид) реализован с их адаптер классы. Они заменяют контроллер на "адаптер"."Описание для переходника гласит:

объект адаптера действует как мост между AdapterView и базовые данные для этого представления.

Я просто смотрю на это Android приложение, которое читает из базы данных, поэтому я не знаю, насколько хорошо она работает еще. Однако это немного похоже на Qt Архитектура Model-View-Delegate, которую они утверждают, является шагом вверх от традиционного шаблона MVC. По крайней мере, на ПК шаблон Qt работает довольно хорошо.


контроллер вида модели (MVC)

enter image description here


описание:

  • когда мы должны основные большие проекты в разработке программного обеспечения, MVC обычно используется, потому что это универсальный способ организации проекты.
  • новые разработчики могут быстро адаптироваться к проекту
  • помощь в развитии больших проектов и кросс-платформы тоже.

шаблон MVC по существу таков:

  • модель: как дисплей. Это может быть источник данных (например: сервер, Raw данные в приложении)
  • View: как он отображается. Это может быть xml. Таким образом, он действует как фильтр презентации. Вид прикрепляется к его модели (или части модели) и получает данные, необходимые для презентации.
  • контроллер: обработка событий, таких как пользовательский ввод. Это будет активность

важная особенность MVC: мы можем изменить либо модель или вид или контроллер все еще не влияет на другие

  • говорят, что мы меняем цвет, в вид, размер или положение из вида. Таким образом, это не повлияет на модель или контроллер
  • скажем, мы меняем модель (вместо данных, полученных с сервера fetch data from assets), но это не повлияет на взгляд и контроллер
  • скажем, мы меняем контроллер (логику в деятельности), это не повлияет модель и вид

Я думаю, что самое полезное упрощенное объяснение здесь: http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf

из всего, что я видел и читал здесь, реализация всех этих вещей усложняет и не вписывается в другие части android.

наличие активности реализации других слушателей уже является стандартным способом Android. Самым безвредным способом было бы добавить наблюдателя Java, как слайды описывают и группируют onClick и другие типы действий в функции, которые все еще находятся в действии.

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

Я согласен с 2-й пост. Это вроде как уже реализовано, просто не так, как привыкли люди. Независимо от того, находится ли он в одном файле или нет, разделение уже существует. Нет необходимости создавать дополнительное разделение, чтобы оно подходило другим языки и Осы.


устал от катастрофы MVx на Android я недавно сделал крошечную библиотеку, которая обеспечивает однонаправленный поток данных и похожа на концепцию MVC:https://github.com/zserge/anvil

в принципе, у вас есть компонент (activity, fragment и viewgroup). Внутри вы определяете структуру и стиль слоя представления. Также вы определяете, как данные должны быть привязаны к представлениям. Наконец, вы можете связать слушателей в том же месте.

затем, как только ваш данные изменяются-будет вызван глобальный метод "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 без lambdas.

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

(отказ от ответственности: я автор этой библиотеки)


не реализована архитектура MVC, но существует набор библиотек / примеров для реализации архитектуры MVP (model–view–presenter).

пожалуйста, проверьте эти ссылки:

Google добавил пример архитектуры Android MVP:


Я видел, что многие люди говорят, что MVC уже реализован в Android, но это не так. Android не следует MVC по умолчанию.

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

Это обеспечивает простой способ изменить код, а также помочь в нежелательных проблемах. Те приходят в простых шаблонов дизайна Android. Если вы хотите реализовать MVC на Android, следуйте приведенной ниже ссылке и наслаждайтесь методами реализации MVC в своем проекте.

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


по данным объяснение что команда Xamarin объяснила (на iOS MVC "я знаю, что это кажется странным, но подождите секунду"):

  • модель (данные или логика приложения),
  • вид (пользовательский интерфейс), и
  • контроллер (за код).

Я могу сказать так:

модель на Android-это просто объект parcelable. Представление является XML-макетом, а контроллер - (activity + its фрагмент.)

*Это просто мое мнение, а не из какого-либо ресурса или книги.


когда мы применяем MVC,MVVM или Модель Презентации для Android-приложения мы действительно хотим иметь четкий структурированный проект и, что более важно, проще для модульных тестов.

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

более того, вы должны запускать модульные тесты Android вместо обычных тестов JUnit, которые принимают возраст, чтобы запустить и сделать модульные тесты несколько непрактичными. По этим причинам несколько лет назад мы начали проект с открытым исходным кодом, RoboBinding-структура модели представления привязки данных для платформы Android.

RoboBinding поможет вам написать код пользовательского интерфейса, который легче читать, тестировать и поддерживать. RoboBinding устраняет необходимость ненужный код, как addXXListener или так, и переносит логику UI на модель представления, которая является POJO и может быть протестирована через обычные тесты JUnit. RoboBinding само приходит с больше чем 300 испытаниями JUnit обеспечить свое качество.


было удивительно видеть, что ни один из сообщений здесь не ответил на вопрос. Они либо слишком общие, расплывчатые, неправильные, либо не касаются реализации в android.

в MVC,посмотреть layer только знает, как показать пользовательский интерфейс (UI). Если для этого нужны какие-либо данные, он получает их от модель слой. Но представление не напрямую просит модель найти данные, оно делает это через контроллер. Так контроллер называет модель предоставить необходимые данные для посмотреть. Как только данные будут готовы,контроллер сообщает посмотреть что данные готовы быть приобретенными от модель. Теперь посмотреть можно получить данные из модель.

этот поток можно резюмировать следующим образом:

enter image description here

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

на части реализации, одна из первых вещей, которая приходит на ум, что какой компонент android должен использоваться для посмотреть? Activity или Fragment ?

ответ заключается в том, что это не имеет значения, и оба могут быть использованы. The посмотреть должен иметь возможность представить пользовательский интерфейс (UI) на устройстве и реагировать на взаимодействие пользователя с пользовательским интерфейсом. Оба!--0--> и Fragment укажите необходимые методы для этого.

в примере приложения в этой статье я использовал Activity на посмотреть слой, но Fragment также можно использовать.

в полный пример приложения можно найти в ветке " mvc " моего репозитория GitHub здесь.

Я также имел дело с плюсами и минусами архитектуры MVC в android через пример здесь.

для тех, кто заинтересован, я начал серию статей по архитектуре android app здесь в котором я сравниваю различные архитектуры, т. е. MVC, MVP, MVVM, для разработки приложений для android через полное рабочее приложение.


MVC model

Model-View-контроллер в Android Примерно в 2011 году, когда Android начал становиться все более популярным, естественно появились вопросы архитектуры. Поскольку MVC был одним из самых популярных шаблонов пользовательского интерфейса в то время, разработчики попытались применить его и к Android.

модель Модель представляет собой набор классов, описывающих бизнес-логику, т. е. бизнес-модель, а также операции доступа к данным, т. е. модель данных. Это также определение бизнес-правил для данных означает способ изменения данных и управления ими.

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

контроллер Контроллер отвечает за обработку входящих запросов. Он получает входные данные от пользователей через представление, а затем обрабатывает данные пользователя с помощью Модель и передача результатов обратно в представление. Как правило, он выступает в качестве координатора между представлением и моделью.

другими словами

Модели: Контент-Провайдерами. Менеджеры данных, которые являются рекомендуемой формой обмена данными между приложениями.

Просмотров: Деятельности. Это основной компонент пользовательского интерфейса приложения. Каждый отдельный экран приложения для Android является производным от класса Java Activity (android.приложение.Деятельность.) Они контейнеры для просмотров (android.вид.Вид.)

Контроллеры: Услуги. Это фоновые компоненты, которые ведут себя как демоны UNIX и службы Windows. Они бегут незримо и выполняют продолжающийся автоматический обрабатывать.