android mvvm框架例子,Android-MVVM架构模式

图片来源于网络

前面说了MVC和MVP架构模式,那下面就来聊聊MVVM架构模式,这个架构模式我之前也是没有用过,身边也很少朋友用到这个架构模式,既然它存在我们就要了解他。

MVVM详解

MVVM是Model-View-ViewModel的简写。

Model代表基本的业务逻辑;

View显示内容,用户界面;

ViewModel将Model和View两者联系在一起。

在这里插入图片描述

MVVM的优点

低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。

可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。

独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。

可测试。界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。

MVVM实现登录小案例

1.分包结构

在这里插入图片描述

2.配置Model的build.gradle文件

android{

dataBinding{

enabled = true

}

}

3.xml文件

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools">

name="viewModel"

type="com.wyb.app_mvvm2.viewmodel.MainViewModel"/>

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".view.MainActivity"

tools:layout_editor_absoluteY="81dp">

android:id="@+id/et_username"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="用户名"

app:addTextChangedListener="@{viewModel.userNameChangeListener}"

app:layout_constraintBottom_toTopOf="@+id/et_pwd"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintHorizontal_bias="0.0"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toTopOf="parent"

app:layout_constraintVertical_bias="0.0" />

android:id="@+id/et_pwd"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="密码"

app:addTextChangedListener="@{viewModel.pwdChangeListener}"

app:layout_constraintTop_toBottomOf="@id/et_username" />

android:id="@+id/btn_login"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="登录"

android:onClick="@{viewModel.login}"

app:layout_constraintTop_toBottomOf="@+id/et_pwd" />

4.Model层

主要是Bean数据类,小案例使用硬编码的形式,所以没有用到。

public class User {

/**

* 用户名

*/

private String name;

/**

* 密码

*/

private String pwd;

public User(String name, String pwd) {

this.name = name;

this.pwd = pwd;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPwd() {

return pwd;

}

public void setPwd(String pwd) {

this.pwd = pwd;

}

}

5.view层

用户界面,主要用来放Activity、Fragment、Dialog。

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);

MainViewModel mainViewModel = new MainViewModel(this);

binding.setViewModel(mainViewModel);

}

}

6.ViewModel层

主要用于View和Model之间的联系,业务逻辑处理。

public class MainViewModel {

/**

* 用户名

*/

private String userName;

/**

* 密码

*/

private String pwd;

/**

* 上下文

*/

private Context mContext;

public MainViewModel(Context mContext) {

this.mContext = mContext;

}

/**

* 获取用户输入的用户名方法

*/

public TextWatcher userNameChangeListener() {

return new TextWatcher() {

@Override

public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override

public void onTextChanged(CharSequence s, int start, int before, int count) {

userName = s.toString();

}

@Override

public void afterTextChanged(Editable s) {

}

};

}

/**

* 获取用户输入的密码方法

*/

public TextWatcher pwdChangeListener() {

return new TextWatcher() {

@Override

public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override

public void onTextChanged(CharSequence s, int start, int before, int count) {

pwd = s.toString();

}

@Override

public void afterTextChanged(Editable s) {

}

};

}

/**

* 登录的方法

*

* @param view 绑定登录事件的视图

*/

public void login(View view) {

if (!TextUtils.isEmpty(userName) && !TextUtils.isEmpty(pwd)) {

// 模拟数据判断

if (userName.equals("zhangsan") && pwd.equals("123456")) {

Toast.makeText(mContext, "登录成功!!!", Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(mContext, "登录失败!!!", Toast.LENGTH_SHORT).show();

}

} else {

Toast.makeText(mContext, "用户名和密码都不能为空哦", Toast.LENGTH_SHORT).show();

}

}

}

上面内容是我对MVVM架构模式的一些理解,通过MVVM来实现登录小案例,希望对想要了解MVP的小伙伴们有帮助。

你可能感兴趣的:(android,mvvm框架例子)