MVC візерунок на Android


497

Чи можливо реалізувати модель Java-вигляд – контролер в Java для Android?

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


64
Ваше запитання дуже добре. Але відповідь, позначена як рішення, на мій погляд не вірна. Це може ввести в оману кількох людей.
Сагар

4
Перегляньте мої 2 публікації, починаючи тут Android Архітектура: MV?
Дорі

1
Чи є додатковий набір правил, яких слід дотримуватися MVC, чи розробка Android вже адаптована до MVC через активність, XML, ресурси?
Полум’я удуна

3
@Dori, я виправляю ваше посилання: Архітектура Android: MV?
Андрейбета

Ця стаття точно відповідає тому, що ви шукаєте, MVC в android через практичний приклад: digigene.com/architecture/android-architecture-part-2-mvc
Ali Nem

Відповіді:


239

В Android у вас немає MVC, але у вас є таке:

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

3
@JDPekham, чому ви говорите "Ви не можете створити активність без розмови зі своїм макетом / поданням"? Для активізації діяльності не потрібно розмовляти з поглядами, насправді розмова з думками аж ніяк не є частиною інстанції діяльності. Ви МОЖЕТЕ (але не обов’язково) викликати різні методи діяльності, які взаємодіють з вашими поглядами, коли і якщо вважаєте за потрібне. Друге питання: якщо припустити, що діяльність призначена для того, щоб взяти на себе роль "контролера" (я вважаю, багато розробників Android бачать це саме так), чому б не поговорити з вашими поглядами від діяльності?

8
Для всіх, хто каже, що "Android - це MVC", спробуйте на тиждень Backbone.js (так, клієнтський js), а потім поверніться і скажіть, що "Android - MVC". Ви нарешті зрозумієте питання, і чому ми продовжуємо задавати питання :)
Марк Петерсон

14
"В Android у вас немає MVC" ???? В Android, як і в інших мовах, у вас є MVC, якщо ви хочете MVC.
Лоренцо Барбаглі

1
@LorenzoBarbagli Це означає, що Android не застосовує MVC у додатках за допомогою дизайну (як це робить iOS). Вам потрібно самостійно реалізувати аромат MVC, MVP або щось інше, якщо ви хочете досягти того, що надає MVC, а саме - відокремлення проблем та ізольована, легко перевіряема модель.
Piovezan

Ні. У Android напевно є MVC, але більш неявно. Він просто реалізований по-різному, як Android будує все.
6рхіда

229

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

  • Модель: Що візуалізувати
  • Вид: Як візуалізувати
  • Контролер: події, введення користувача

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

Це особливо корисно, коли ви використовуєте Mono для спільного використання моделі для розробки кросплатформних додатків.


12
Хоча це правда, і, мабуть, це теорія, і люди практичні!
TWiStErRob

1
@TWiStErRob Але моделі дизайну - це теоретичні, абстрактні ідеї, які не мають лише одного способу їх реалізації. Проголошення "Я не хочу розуміти MVC в теорії, я просто хочу, щоб це було впроваджено" мені звучить так, що це може призвести до "Я буду ставити пральну машину на кухні, тому що пральні машини реалізують схему Cleaner ™ і кухні цього потребують ».
Лука

1
Я думаю, що приклади є безцінними, оскільки вони показують, що придумали інші люди. Можна вдосконалитись і навчитися їх зусиллям. Не потрібно всім винаходити колесо. В контексті Android і його складного життєвого циклу є проблеми, не вирішені в дизайнерському шаблоні, але кожен зіткнеться з ними. Це я мав на увазі під практичним.
TWiStErRob

47

Дії, погляди та дії на Android є основним способом роботи з інтерфейсом Android та є реалізацією моделі «погляд-перегляд-перегляд» (MVVM) , що структурно схожа (у тій самій сім’ї, що і модель) –погляд –Контролер.

Наскільки мені відомо, немає можливості вийти з цієї моделі. Можливо, це можливо зробити, але ви, ймовірно, втратите всю вигоду, яку має існуюча модель, і вам доведеться переписати свій власний шар інтерфейсу, щоб він працював.


29

Після деяких пошуків найбільш розумною відповіддю є наступна:

MVC вже реалізований в Android як:

  1. Перегляд = макет, ресурси та вбудовані класи, як Buttonпохідні від android.view.View.
  2. Контролер = Діяльність
  3. Модель = класи, які реалізують логіку програми

(Це, до речі, передбачає відсутність логіки домену додатків у діяльності.)

Найрозумніше для маленького розробника - дотримуватися цієї схеми і не намагатися робити те, що Google вирішив не робити.

PS Зауважте, що Діяльність іноді перезапускається, тому для модельних даних тут не місце (найпростіший спосіб викликати перезапуск - це опустити android:configChanges="keyboardHidden|orientation"XML і повернути свій пристрій).

EDIT

Ми можемо говорити про MVC , але це буде так сказати FMVC , Framework - Model - View - Controller . Framework (ОС Android) нав'язує свою ідею компоненти життєвого циклу і пов'язаних з ними подій, і на практиці контролер ( Activity/ Service/ BroadcastReceiver), в першу чергу відповідає за впоратися з цим Framework -imposed подія (такі як OnCreate () ). Чи слід обробляти дані користувача окремо? Навіть якщо це потрібно, ви не можете розділити його, події введення користувача також надходять з Android.

У всякому разі, менше коду , яка не Android-конкретніше ви поклали в свій Activity/ Service/ BroadcastReceiver, тим краще.


3
Діяльність має прямий доступ до інтерфейсу користувача, тоді як у контролері MVC не слід знати про подання (лише навпаки).
Конрад Моравський

2
@KonradMorawski Хммм .... Погляд про відображення речей та про контролер ? Дитина, скажімо, Buttonзнає про контролера ? Логічніше здається, що Погляди знають лише про показ речей. І беручи до уваги, що Модель знає лише про природу даних, саме тому Контролер потрібен: щось повинно знати і про Модель, і про Вид .
18446744073709551615

4
Очевидно Перегляд повинен знати про контролер, щоб делегувати події контролеру. Контролер слідкує за моделлю та інформує Погляд, якими були результати (щоб він міг відображати їх). Контролер не завищує подання (тоді як Діяльність), і він не повинен знати щось про кнопки, текстові поля, списки тощо (тоді як Діяльність знає).
Конрад Моравський

1
Я думаю, Serviceщо також потрапляйте під парасольку контролера
CL22,

1
Коли-небудь чули про спостерігачів? Найкращий Iv, відомий на даний момент, це коли 1. контролер має лише примірник моделі, 2. модель не має контролера контролера або перегляду, але перегляд може зареєструватися як спостерігач моделі (тому модель свого роду знає про вигляд, але він не знає, хто це, і він не дбає) - коли модель виконана з завантаженням даних, він сповіщає всіх спостерігачів (як правило, 1) і 3. У перегляду є лише екземпляр моделі, щоб витягнути з нього дані. Таким чином, є лише 2 залежності для всіх MVC фреймів. Я думаю, що 2 мінімально, тому це має бути найкращий макет.
Srneczek

18

Не існує жодної схеми MVC, якій ви могли б підкорятися. MVC просто стверджує більш-менш, що не слід змішувати дані та перегляд, так що, наприклад, представлення даних відповідає за зберігання даних або класи, які обробляють дані, безпосередньо впливають на представлення даних.

Але все-таки, як Android поводиться з класами та ресурсами, іноді ви навіть змушені слідувати схемі MVC. На мою думку, більш складною є діяльність, яка часом відповідає за думку, але, тим не менш, одночасно виступає контролером.

Якщо ви визначаєте свої погляди та макети у файлах XML, завантажуйте свої ресурси з папки res, а якщо ви не хочете більше чи менше змішувати ці речі у своєму коді, то все одно слід дотримуватися шаблону MVC.


14

Ви можете реалізувати MVC в Android, але він "не підтримується" і вимагає певних зусиль.

Це означає , що я особисто схильний до MVP як набагато більш чистої архітектурної структури для розробки Android. І кажучи про MVP, я маю на увазі це:

введіть тут опис зображення

Я також опублікував понад докладну відповідь тут .

Граючи з різними підходами до реалізації MVC / MVP в Android, я придумав розумний архітектурний зразок, який я описав у цій публікації: MVP та MVC Architectural Patterns в Android .


14

Найкращий ресурс, який я знайшов для впровадження MVC на Android, це це повідомлення :

Я дотримувався одного і того ж дизайну на одному зі своїх проектів, і він чудово працював. Я початківець на Android, тому не можу сказати, що це найкраще рішення.

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


8
Було б чудово отримати підсумок, якщо стаття буде видалена одного дня.
pqsk

12

Я погоджуюся з JDPeckham, і я вважаю, що тільки XML недостатній для реалізації частини програми UI.

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

(Крім того, ви можете використовувати однотонний шаблон, як це запропоновано в Додатковій документації)


12

MVC - Архітектура на Android Краще слідувати будь-якому MVP, а не MVC в android. Але все ж відповідно до відповіді на питання це може бути вирішенням

Введіть тут опис зображення

Опис та вказівки

     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: Розділення коду є дуже важливим. Кожен компонент в архітектурі повинен бути незалежним, не мати залежної логіки. Якщо випадково, якщо у вас є щось залежне від логіки, то напишіть між ними клас логіки відображення. Це допоможе вам у майбутньому.


11

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

дзеркало для pdf


7
посилання порушено, сер
Rat-a-tat-a-tat Ratatouille

2
Здається, цей файл COSC346-lab2.2up.pdf не містить повних деталей.
Джеймс

9

MVC-модель Android (на зразок) реалізована разом з їх класами адаптерів . Вони замінюють контролер на «адаптер». В описі адаптера зазначено:

Об'єкт Adapter діє як міст між AdapterView і базовими даними для цього представлення.

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


9

Хоча ця публікація здається давньою, я хотів би додати наступні два, щоб повідомити про останні розробки в цій галузі для Android:

андроїд-зв'язування - надання структури, яка дозволяє прив’язувати віджети андроїд-перегляду до моделі даних. Це допомагає реалізувати шаблони MVC або MVVM в додатках для Android.

roboguice - RoboGuice виводить здогадки з розробки. Вставте свій погляд, ресурс, системну службу чи будь-який інший об’єкт, і дозвольте RoboGuice піклуватися про деталі.


9

Модельний контролер (MVC)

введіть тут опис зображення


Опис:

  • Коли нам доводиться вести великі проекти в розробці програмного забезпечення, MVC зазвичай використовується, оскільки це універсальний спосіб організації проектів.
  • Нові розробники можуть швидко адаптуватися до проекту
  • Допомагає розробці великих проектів і крос-платформи.

Шаблон MVC по суті такий:

  • Модель: Що відображати Це може бути джерело даних (наприклад: Сервер, Сирі дані в додатку)
  • Вид: Як відображається. Це може бути xml. Таким чином, він виступає як презентаційний фільтр. Перегляд додається до його моделі (або частини моделі) і отримує необхідні для презентації дані.
  • Контролер: обробка подій, таких як введення користувача. Це буде діяльність

Важлива особливість MVC: ми можемо модифікувати або модель, або перегляд, або контролер, як і раніше, не впливаючи на інші

  • Скажімо, ми змінюємо колір у вікні, розмір подання або положення виду. Це не вплине на модель або контролер
  • Скажімо, ми змінюємо модель (замість даних, отриманих із сервера, даних із активів), все одно це не вплине на представлення та контролер
  • Скажімо, ми змінимо контролер (логіка в діяльності), це не вплине на модель і вигляд

2
Я тільки коли-небудь використовував контролер як трубопровід для перегляду / моделювання ретрансляції інформації. Мені цікаво, як у вас є модель та погляд у прямому контакті один з одним. У вас є джерело чи приклад цієї реалізації?
Джексонкр

7

Я думаю, що найкорисніше спрощене пояснення тут: http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf

З усього іншого, що я бачив і читав тут, реалізація всіх цих речей ускладнює і не добре поєднується з іншими частинами андроїда.

Активність з реалізацією інших слухачів - це вже стандартний спосіб Android. Найбільш нешкідливим способом було б додати Java Observer, як слайди описують та групують onClick та інші типи дій у функції, які все ще знаходяться в Діяльності.

Спосіб Android полягає в тому, що Діяльність робить і те, і інше. Боротьба з цим насправді не спрощує розширення або робити майбутнє кодування.

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


6
Посилання, яке ви надали, порушено.
mmBs

6

Дивно було побачити, що жодна з публікацій тут не відповіла на питання. Вони або занадто загальні, розпливчасті, неправильні, або не стосуються впровадження в android.

У MVC шар View знає лише, як показати інтерфейс користувача (UI). Якщо для цього потрібні якісь дані, вони отримують їх із рівня Модель . Але Перегляд НЕ прямо просить модель знайти дані, це робить це через Контролер . Таким чином, Контролер  викликає Модель для надання необхідних даних для Перегляду . Після того, як дані будуть готові, Контролер повідомляє Погляд, що дані готові бути отримані з Моделі . Тепер Перегляд може отримати дані з Моделі .

Цей потік можна підсумувати, як показано нижче:

введіть тут опис зображення

Варто зазначити, що Перегляд може знати про наявність даних у  Моделі  або через Контролер - також відомий як  Пасивний MVC - або спостерігаючи за даними в Моделі , зареєструвавши до неї спостережувані дані, що є Active MVC .

Що стосується реалізації, одне з перших, що спадає на думку, - це те, який андроїдний компонент слід використовувати для перегляду ? Activity  або Fragment ?

Відповідь - це не має значення, і обидва можна використовувати. View повинен бути в змозі уявити призначений для користувача інтерфейс (UI) на пристрої та реагувати на взаємодію користувача з інтерфейсом. І те, Activity  і інше Fragment  надають необхідні для цього методи.

У прикладі програми, що використовується в цій статті, я використовував Activity для шару « Перегляд» , але Fragment  також його можна використовувати.

Повний зразок програми можна знайти у відділенні mvc мого репортажу GitHub тут .

Я також розглядав плюси і мінуси архітектури MVC в android на прикладі тут .

Для тих, хто цікавиться, я розпочав низку статей про архітектуру додатків для Android тут, в яких я порівнюю різні архітектури, тобто MVC, MVP, MVVM, для розробки додатків для Android через повний робочий додаток.


Я взяв курс архітектури, де викладач зазначає, що діяльність та фрагменти не повинні використовуватися як погляди, а насправді повинні бути контролери, а погляди - окремими файлами. Чи є у вас думка щодо або міркування, чому цього не повинно бути?
brandonx

Я не думаю, що інструктор в цьому точний. Вибір активності або фрагмента як контролера означає передачу контексту контролеру. З іншого боку, перегляду також потрібен контекст для малювання на екрані. Таким чином, тобто передача контексту контролеру, додаток робить схильним до витоку пам'яті, і я вважаю, що контролер не повинен переносити стан.
Алі Нем

5

Втомившись від катастрофи MVx на Android, я нещодавно створив крихітну бібліотеку, яка забезпечує однонаправлений потік даних і схожа на концепцію 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 додав приклад MVP архітектури Android:


3

Я бачив, що багато людей кажуть, що MVC вже реалізований в Android, але це неправда. Android за замовчуванням не відповідає MVC.

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

Він надає простий спосіб зміни коду, а також допомагає зменшити проблеми. Якщо ви хочете реалізувати MVC на Android, перейдіть за цим нижче посиланням та насолоджуйтесь реалізацією MVC у своєму проекті.

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

Але в наш час я думаю, що MVP разом із архітектурною схемою Android є одним з найкращих варіантів, який розробники повинні використовувати для чистих та надійних додатків для Android.


1
Домовились. Android має достатню гнучкість, щоб повісити себе. Ця ваша активність може швидко стати гігантською і складною, оскільки вона обробляє всі три аспекти MVC.
Скотт Біггс

2

Коли ми застосовуємо MVC, MVVM або презентаційну модель до програми для Android, ми дійсно хочемо мати чіткий структурований проект і, що ще важливіше, простіше для одиничних тестів.

На даний момент без сторонніх фреймворків у вас зазвичай багато коду (наприклад, addXXListener (), findViewById () тощо), що не додає ніякої цінності для бізнесу.

Більше того, замість звичайних тестів JUnit вам потрібно запустити тести Android, які потребують віків, а тести з модулем дещо недоцільні. З цієї причини кілька років тому ми розпочали проект з відкритим кодом, RoboBinding - Рамка для презентації моделі, що зобов’язує дані, для платформи Android.

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


1

Наскільки я розумію, як Android обробляє MVC-зразок:

У вас є діяльність, яка виконує функції контролера. У вас є клас, відповідальність за отримання даних - модель, а потім у вас клас View, який є переглядом.

Говорячи про вигляд, більшість людей думають лише про його візуальну частину, визначену в xml. Не будемо забувати, що у представлення також є програмна частина зі своїми конструкторами, методами та ін., Визначеними у класі java.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.