Рубрики
Без рубрики

Шаблон дизайна Android MVVM

Android MVVM, шаблон представления модели Android, шаблон MVVM для Android, пример mvvm для Android, шаблоны проектирования android, учебник по MVVM для Android, пример кода шаблона MVVM для Android.

Автор оригинала: Pankaj Kumar.

В этом уроке мы обсудим и реализуем архитектурный шаблон Android MVVM в нашем приложении для Android. Ранее мы обсуждали шаблон MVP для Android .

Android MVVM

MVVM означает Модель , Представление , Модель представления .

  • Модель : Здесь хранятся данные приложения. Он не может напрямую общаться с Видом. Как правило, рекомендуется предоставлять данные модели представления с помощью наблюдаемых объектов.
  • Вид : Он представляет пользовательский интерфейс приложения, лишенный какой-либо логики приложения. Он наблюдает за моделью представления.
  • ViewModel : Он действует как связующее звено между Моделью и Представлением. Он отвечает за преобразование данных из модели. Он предоставляет потоки данных для представления. Он также использует крючки или обратные вызовы для обновления представления. Он запросит данные из модели.

Следующий поток иллюстрирует основной шаблон MVVM.

Чем это отличается от MVP?

  • ViewModel заменяет докладчика в Среднем слое.
  • Ведущий содержит ссылки на Представление. Модель представления этого не делает.
  • Ведущий обновляет представление классическим способом (методы запуска).
  • Модель представления отправляет потоки данных.
  • Ведущий и представление находятся в соотношении 1 к 1.
  • Представление и модель представления находятся в соотношении 1 ко многим.
  • Модель представления не знает, что представление прослушивает ее.

Существует два способа реализации MVVM в Android:

  • Привязка Данных
  • RxJava

В этом уроке мы будем использовать только привязку данных. Библиотека привязки данных была введена Google для привязки данных непосредственно в xml-макете. Для получения дополнительной информации о привязке данных обратитесь к этому учебному пособию.

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

Как можно уведомить какой-либо класс, не имея на него ссылки?

Это можно сделать тремя различными способами:

  • Использование Двусторонней Привязки Данных
  • Использование Живых Данных
  • Использование RxJava

Двусторонняя Привязка Данных

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

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

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

Адаптер привязки будет прослушивать изменения в свойстве атрибута.

Мы узнаем больше о двусторонней привязке данных в приведенном ниже примере.

Пример структуры проекта Android MVVM

Добавление библиотеки привязки данных

Добавьте следующий код в файл build.gradle вашего приложения:

android {

    dataBinding {
        enabled = true
    }
}

Это позволяет привязывать данные в вашем приложении.

Добавление зависимостей

Добавьте следующие зависимости в свой файл build.gradle :

implementation 'android.arch.lifecycle:extensions:1.1.0'

Модель

Модель будет содержать адрес электронной почты и пароль пользователя. Следующее User.java класс делает это:

package com.journaldev.androidmvvmbasics.model;


public class User {
    private String email;
    private String password;

    public User(String email, String password) {
        this.email = email;
        this.password = password;
    }

    public void setEmail(String email) {
        this.email = email;
    }


    public String getEmail() {
        return email;
    }

    public void setPassword(String password) {
        this.password = password;
    }


    public String getPassword() {
        return password;
    }


}

Двусторонняя привязка данных позволяет нам связывать объекты в XML-макетах таким образом, чтобы объект мог отправлять данные в макет и наоборот.

Синтаксис двусторонней привязки данных @={переменная}

Расположение

Код для activity_main.xml приводится ниже:




    

        
    


    

        

            


            


            


        

    


Привязка данных требует, чтобы мы установили тег макета вверху. Здесь наша модель представления привязывает данные к представлению. ()-> ViewModel.onLoginClicked() вызывает лямбду прослушивателя щелчка кнопки, определенную в нашей модели просмотра. Текст редактирования обновляет значения в модели (через Модель представления).

привязка:toastMessage="@{ViewModel.toastMessage}" -это пользовательский атрибут, который мы создали для двусторонней привязки данных. На основе изменений в сообщении тоста в модели представления адаптер привязки будет активирован в представлении.

Модель представления

Код для LoginViewModel.java приводится ниже:

package com.journaldev.androidmvvmbasics.viewmodels;

import android.databinding.BaseObservable;
import android.databinding.Bindable;
import android.text.TextUtils;
import android.util.Patterns;

import com.android.databinding.library.baseAdapters.BR;
import com.journaldev.androidmvvmbasics.model.User;

public class LoginViewModel extends BaseObservable {
    private User user;


    private String successMessage = "Login was successful";
    private String errorMessage = "Email or Password not valid";

    @Bindable
    private String toastMessage = null;


    public String getToastMessage() {
        return toastMessage;
    }


    private void setToastMessage(String toastMessage) {

        this.toastMessage = toastMessage;
        notifyPropertyChanged(BR.toastMessage);
    }


    public void setUserEmail(String email) {
        user.setEmail(email);
        notifyPropertyChanged(BR.userEmail);
    }

    @Bindable
    public String getUserEmail() {
        return user.getEmail();
    }

    @Bindable
    public String getUserPassword() {
        return user.getPassword();
    }

    public void setUserPassword(String password) {
        user.setPassword(password);
        notifyPropertyChanged(BR.userPassword);
    }

    public LoginViewModel() {
        user = new User("","");
    }

    public void onLoginClicked() {
        if (isInputDataValid())
            setToastMessage(successMessage);
        else
            setToastMessage(errorMessage);
    }

    public boolean isInputDataValid() {
        return !TextUtils.isEmpty(getUserEmail()) && Patterns.EMAIL_ADDRESS.matcher(getUserEmail()).matches() && getUserPassword().length() > 5;
    }
}

Методы, которые были вызваны в макете, реализованы в приведенном выше коде с той же подписью. Если XML-аналог метода не существует, нам нужно изменить атрибут на app: .

Приведенный выше класс также может расширять ViewModel. Но нам нужна базовая наблюдаемость, так как она преобразует данные в потоки и уведомляет об изменении свойства всплывающее сообщение .

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

Код для MainActivity.java класс приведен ниже:

package com.journaldev.androidmvvmbasics.views;


import android.databinding.BindingAdapter;
import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;


import com.journaldev.androidmvvmbasics.R;
import com.journaldev.androidmvvmbasics.databinding.ActivityMainBinding;
import com.journaldev.androidmvvmbasics.viewmodels.LoginViewModel;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        activityMainBinding.setViewModel(new LoginViewModel());
        activityMainBinding.executePendingBindings();

    }

    @BindingAdapter({"toastMessage"})
    public static void runMe(View view, String message) {
        if (message != null)
            Toast.makeText(view.getContext(), message, Toast.LENGTH_SHORT).show();
    }
}

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

Таким образом, в приведенном выше приложении ViewModel обновляет модель, прослушивая изменения в представлении. Кроме того, модель может обновлять представление через ViewModel с помощью NotifyPropertyChanged

Результаты приведенного выше приложения в действии приведены ниже:

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