Чи можливо реалізувати модель Java-вигляд – контролер в Java для Android?
Або це вже реалізовано через діяльність? Або є кращий спосіб реалізувати шаблон MVC для Android?
Чи можливо реалізувати модель Java-вигляд – контролер в Java для Android?
Або це вже реалізовано через діяльність? Або є кращий спосіб реалізувати шаблон MVC для Android?
Відповіді:
В Android у вас немає MVC, але у вас є таке:
Не існує універсально унікального шаблону MVC. MVC - це концепція, а не міцна рамка програмування. Ви можете реалізувати свій власний MVC на будь-якій платформі. Поки ви дотримуєтесь такої основної ідеї, ви реалізуєте MVC:
Також подумайте про це так: Коли ви програмуєте свою модель, модель не повинна турбуватися про візуалізацію (або конкретний код платформи). Модель сказала б виду, мені байдуже, чи ваша візуалізація - це Android, iOS або Windows Phone, це те, що мені потрібно, щоб ви надали. Перегляд оброблятиме лише конкретний код відтворення платформи.
Це особливо корисно, коли ви використовуєте Mono для спільного використання моделі для розробки кросплатформних додатків.
Дії, погляди та дії на Android є основним способом роботи з інтерфейсом Android та є реалізацією моделі «погляд-перегляд-перегляд» (MVVM) , що структурно схожа (у тій самій сім’ї, що і модель) –погляд –Контролер.
Наскільки мені відомо, немає можливості вийти з цієї моделі. Можливо, це можливо зробити, але ви, ймовірно, втратите всю вигоду, яку має існуюча модель, і вам доведеться переписати свій власний шар інтерфейсу, щоб він працював.
Після деяких пошуків найбільш розумною відповіддю є наступна:
MVC вже реалізований в Android як:
Button
похідні від android.view.View
.(Це, до речі, передбачає відсутність логіки домену додатків у діяльності.)
Найрозумніше для маленького розробника - дотримуватися цієї схеми і не намагатися робити те, що 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
, тим краще.
Button
знає про контролера ? Логічніше здається, що Погляди знають лише про показ речей. І беручи до уваги, що Модель знає лише про природу даних, саме тому Контролер потрібен: щось повинно знати і про Модель, і про Вид .
Service
що також потрапляйте під парасольку контролера
Не існує жодної схеми MVC, якій ви могли б підкорятися. MVC просто стверджує більш-менш, що не слід змішувати дані та перегляд, так що, наприклад, представлення даних відповідає за зберігання даних або класи, які обробляють дані, безпосередньо впливають на представлення даних.
Але все-таки, як Android поводиться з класами та ресурсами, іноді ви навіть змушені слідувати схемі MVC. На мою думку, більш складною є діяльність, яка часом відповідає за думку, але, тим не менш, одночасно виступає контролером.
Якщо ви визначаєте свої погляди та макети у файлах XML, завантажуйте свої ресурси з папки res, а якщо ви не хочете більше чи менше змішувати ці речі у своєму коді, то все одно слід дотримуватися шаблону MVC.
Ви можете реалізувати MVC в Android, але він "не підтримується" і вимагає певних зусиль.
Це означає , що я особисто схильний до MVP як набагато більш чистої архітектурної структури для розробки Android. І кажучи про MVP, я маю на увазі це:
Я також опублікував понад докладну відповідь тут .
Граючи з різними підходами до реалізації MVC / MVP в Android, я придумав розумний архітектурний зразок, який я описав у цій публікації: MVP та MVC Architectural Patterns в Android .
Найкращий ресурс, який я знайшов для впровадження MVC на Android, це це повідомлення :
Я дотримувався одного і того ж дизайну на одному зі своїх проектів, і він чудово працював. Я початківець на Android, тому не можу сказати, що це найкраще рішення.
Я вніс одну модифікацію: я створив модель і контролер для кожної діяльності в класі додатків, щоб вони не були відтворені, коли змінився режим пейзажу-портрета.
Я погоджуюся з JDPeckham, і я вважаю, що тільки XML недостатній для реалізації частини програми UI.
Однак якщо ви розглядаєте Діяльність як частину погляду, то реалізація MVC є досить простою. Ви можете змінити програму Application (як повернуто через getApplication () у Activity), і саме тут ви можете створити контролер, який зберігається протягом вашої програми.
(Крім того, ви можете використовувати однотонний шаблон, як це запропоновано в Додатковій документації)
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: Розділення коду є дуже важливим. Кожен компонент в архітектурі повинен бути незалежним, не мати залежної логіки. Якщо випадково, якщо у вас є щось залежне від логіки, то напишіть між ними клас логіки відображення. Це допоможе вам у майбутньому.
Створення інтерфейсу Android за допомогою макетів, ресурсів, діяльності та намірів - це реалізація шаблону MVC. Щоб отримати докладнішу інформацію про це, перегляньте наступне посилання - http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf
MVC-модель Android (на зразок) реалізована разом з їх класами адаптерів . Вони замінюють контролер на «адаптер». В описі адаптера зазначено:
Об'єкт Adapter діє як міст між AdapterView і базовими даними для цього представлення.
Я просто розглядаю це для програми Android, яка читає з бази даних, тому я ще не знаю, наскільки добре вона працює. Однак це здається трохи схожим на архітектуру Model-View-Delegate Qt, яка, на їхню думку, є кроком до традиційного шаблону MVC. Принаймні на ПК, Qt-схема працює досить добре.
Хоча ця публікація здається давньою, я хотів би додати наступні два, щоб повідомити про останні розробки в цій галузі для Android:
андроїд-зв'язування - надання структури, яка дозволяє прив’язувати віджети андроїд-перегляду до моделі даних. Це допомагає реалізувати шаблони MVC або MVVM в додатках для Android.
roboguice - RoboGuice виводить здогадки з розробки. Вставте свій погляд, ресурс, системну службу чи будь-який інший об’єкт, і дозвольте RoboGuice піклуватися про деталі.
Опис:
Шаблон MVC по суті такий:
Важлива особливість MVC: ми можемо модифікувати або модель, або перегляд, або контролер, як і раніше, не впливаючи на інші
Я думаю, що найкорисніше спрощене пояснення тут: http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf
З усього іншого, що я бачив і читав тут, реалізація всіх цих речей ускладнює і не добре поєднується з іншими частинами андроїда.
Активність з реалізацією інших слухачів - це вже стандартний спосіб Android. Найбільш нешкідливим способом було б додати Java Observer, як слайди описують та групують onClick та інші типи дій у функції, які все ще знаходяться в Діяльності.
Спосіб Android полягає в тому, що Діяльність робить і те, і інше. Боротьба з цим насправді не спрощує розширення або робити майбутнє кодування.
Я згоден з 2-м постом . Це свого роду вже реалізовано, просто не так, як звикли люди. Незалежно від того, чи є він в одному файлі чи ні, вже є розділення. Немає необхідності створювати додаткові розділення, щоб вони відповідали іншим мовам та ОС.
Дивно було побачити, що жодна з публікацій тут не відповіла на питання. Вони або занадто загальні, розпливчасті, неправильні, або не стосуються впровадження в android.
У MVC шар View знає лише, як показати інтерфейс користувача (UI). Якщо для цього потрібні якісь дані, вони отримують їх із рівня Модель . Але Перегляд НЕ прямо просить модель знайти дані, це робить це через Контролер . Таким чином, Контролер викликає Модель для надання необхідних даних для Перегляду . Після того, як дані будуть готові, Контролер повідомляє Погляд, що дані готові бути отримані з Моделі . Тепер Перегляд може отримати дані з Моделі .
Цей потік можна підсумувати, як показано нижче:
Варто зазначити, що Перегляд може знати про наявність даних у Моделі або через Контролер - також відомий як Пасивний MVC - або спостерігаючи за даними в Моделі , зареєструвавши до неї спостережувані дані, що є Active MVC .
Що стосується реалізації, одне з перших, що спадає на думку, - це те, який андроїдний компонент слід використовувати для перегляду ? Activity
або Fragment
?
Відповідь - це не має значення, і обидва можна використовувати. View повинен бути в змозі уявити призначений для користувача інтерфейс (UI) на пристрої та реагувати на взаємодію користувача з інтерфейсом. І те, Activity
і інше Fragment
надають необхідні для цього методи.
У прикладі програми, що використовується в цій статті, я використовував Activity
для шару « Перегляд» , але Fragment
також його можна використовувати.
Повний зразок програми можна знайти у відділенні mvc мого репортажу GitHub тут .
Я також розглядав плюси і мінуси архітектури MVC в android на прикладі тут .
Для тих, хто цікавиться, я розпочав низку статей про архітектуру додатків для Android тут, в яких я порівнюю різні архітектури, тобто MVC, MVP, MVVM, для розробки додатків для Android через повний робочий додаток.
Втомившись від катастрофи 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 без лямбда.
Сама бібліотека дуже легка, не має залежностей, не використовує рефлексії тощо.
(Відмова: я автор цієї бібліотеки)
Відповідно до пояснення, яке пояснила команда Xamarin (на iOS MVC "Я знаю, це здається дивним, але зачекай секунду"):
Я можу сказати так:
Модель на Android - це просто роздільний об'єкт. Вид - це макет XML, а контролером - (активність + його фрагмент).
* Це лише моя думка, не з будь-якого ресурсу чи книги.
Не існує реалізованої архітектури MVC, але існує набір бібліотек / прикладів для реалізації архітектури MVP (модель-перегляд – презентатор).
Перевірте ці посилання:
Google додав приклад MVP архітектури Android:
Я бачив, що багато людей кажуть, що 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.
Коли ми застосовуємо MVC, MVVM або презентаційну модель до програми для Android, ми дійсно хочемо мати чіткий структурований проект і, що ще важливіше, простіше для одиничних тестів.
На даний момент без сторонніх фреймворків у вас зазвичай багато коду (наприклад, addXXListener (), findViewById () тощо), що не додає ніякої цінності для бізнесу.
Більше того, замість звичайних тестів JUnit вам потрібно запустити тести Android, які потребують віків, а тести з модулем дещо недоцільні. З цієї причини кілька років тому ми розпочали проект з відкритим кодом, RoboBinding - Рамка для презентації моделі, що зобов’язує дані, для платформи Android.
RoboBinding допомагає вам написати код інтерфейсу, який простіше читати, тестувати та підтримувати. RoboBinding знімає необхідність у непотрібному коді, наприклад, addXXListener або близько того , і переносить логіку інтерфейсу користувача на модель презентації, яка є POJO і може бути протестована за допомогою звичайних тестів JUnit . Сам RoboBinding поставляється з більш ніж 300 тестами JUnit для забезпечення його якості.
Наскільки я розумію, як Android обробляє MVC-зразок:
У вас є діяльність, яка виконує функції контролера. У вас є клас, відповідальність за отримання даних - модель, а потім у вас клас View, який є переглядом.
Говорячи про вигляд, більшість людей думають лише про його візуальну частину, визначену в xml. Не будемо забувати, що у представлення також є програмна частина зі своїми конструкторами, методами та ін., Визначеними у класі java.