什么样的资质做电子商务网站,注册个空壳公司需要多少钱,第一app模板免费下载,怎么做国外的网站 卖东西关于MVVM架构#xff0c;我并不想花篇幅去做重复性的描述#xff0c;网上一搜都是一堆讲解#xff0c;大家可以自行了解#xff0c;我所做的只是以最简单的例子#xff0c;最有效的步骤#xff0c;从零开始#xff0c;去实现一个相对有点学习参考价值的项目。
先来看本…关于MVVM架构我并不想花篇幅去做重复性的描述网上一搜都是一堆讲解大家可以自行了解我所做的只是以最简单的例子最有效的步骤从零开始去实现一个相对有点学习参考价值的项目。
先来看本文预计的实现效果 可以看到就是一个非常简单的例子当点击登录按钮之后对用户的输入进行一个简单的判断满足要求之后跳转到首页并显示用户输入的账户信息。那么接下来将分步骤讲解如何以符合MVVM设计规范的代码来实现这个功能重在展示如何从零开始构建一个MVVM框架。
本文使用的开发环境 Android Studio Iguana | 2023.2.1 Patch 1
Gradle版本 gradle-8.4-bin.zip
1.build.gradle文件模块级
1.1使用DataBinding
defaultConfig {...buildFeatures {dataBinding true}...}
1.2 引用依赖
dependencies {implementation androidx.lifecycle:lifecycle-extensions:2.2.0implementation androidx.lifecycle:lifecycle-livedata:2.7.0} 2.绘制布局
当我们新建项目或者是新建activity时系统会默认为我们生成一个布局文件如下 我们需要把默认布局改成DataBinding布局。选中根部局标签按下AltEnter在弹出的选项中选择第一个Convert to data binding layout系统会自动为我们修改布局 修改后的布局
?xml version1.0 encodingutf-8?
!--使用databinding功能根布局需要使用layout标签 --
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/tools!--这是Data Binding的data标签用于定义布局中使用的数据对象和表达式--data/dataandroidx.constraintlayout.widget.ConstraintLayoutandroid:idid/mainandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.ui.main.MainActivity/androidx.constraintlayout.widget.ConstraintLayout/layout
3.Activity文件
/*** 登录活动类负责展示登录界面并处理登录逻辑。*/
public class LoginActivity extends AppCompatActivity {private ActivityLoginBinding binding; // 视图绑定对象private LoginViewModel viewModel; // 登录视图模型/*** 在活动创建时调用用于初始化界面和设置监听器。* * param savedInstanceState 如果活动之前被销毁这参数包含之前的状态。如果活动没被销毁之前这参数是null。*/Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 启用边缘到边缘的界面显示EdgeToEdge.enable(this);// 使用数据绑定初始化视图binding DataBindingUtil.setContentView(this, R.layout.activity_login);// 设置视图嵌入系统边界的监听用于动态设置视图的内边距ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) - {Insets systemBars insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});// 创建或获取登录视图模型viewModel new ViewModelProvider(this).get(LoginViewModel.class);// 将视图模型绑定到视图binding.setViewModel(viewModel);// 初始化点击监听器和观察者initListener();initObserver();}/*** 初始化按钮监听器用于处理登录按钮的点击事件。*/private void initListener() {// 当登录按钮被点击时设置账号和密码并触发登录动作binding.btnLogin.setOnClickListener(v - {viewModel.setAccount(binding.etAccount.getText().toString());viewModel.setPassword(binding.etPassword.getText().toString());viewModel.login();});}/*** 初始化观察者用于处理登录结果。*/private void initObserver() {// 观察登录结果根据结果进行跳转或显示错误信息viewModel.getLoginResult().observe(this, loginResult - {if (loginResult.isSuccess()) {// 登录成功跳转到主界面并传递账号信息Intent intent new Intent(this, MainActivity.class);intent.putExtra(account, viewModel.getAccount().getValue());startActivity(intent);finish();} else {// 登录失败显示错误信息Toast.makeText(this, loginResult.getErrorMessage(), Toast.LENGTH_SHORT).show();}});}
}4.定义ViewModel
比较好的编程规范是每创建一个Activity/Fragment都创建与其对应的ViewModel
/*** 登录视图模型类用于管理登录相关的数据和逻辑。*/
public class LoginViewModel extends ViewModel {// 账户名和密码的LiveData对象用于在UI变化时通知订阅者private MutableLiveDataString account new MutableLiveData();private MutableLiveDataString password new MutableLiveData();private MutableLiveDataLoginResult loginResult new MutableLiveData();/*** 获取账户名的LiveData对象。* return 账户名的LiveData对象。*/public MutableLiveDataString getAccount() {return account;}/*** 获取密码的LiveData对象。* return 密码的LiveData对象。*/public MutableLiveDataString getPassword() {return password;}/*** 获取登录结果的LiveData对象。* return 登录结果的LiveData对象。*/public LiveDataLoginResult getLoginResult() {return loginResult;}/*** 设置账户名。* param account 用户输入的账户名。*/public void setAccount(String account) {this.account.postValue(account);}/*** 设置密码。* param password 用户输入的密码。*/public void setPassword(String password) {this.password.postValue(password);}/*** 执行登录操作。* 根据输入的账户名和密码进行校验成功则更新登录结果为成功失败则更新为错误信息。*/public void login() {if (checkAccount(getAccount().getValue(), getPassword().getValue())) {LoginResult successResult new LoginResult(true, null);loginResult.postValue(successResult);} else {LoginResult errorResult new LoginResult(false, 账号或密码错误);loginResult.postValue(errorResult);}}/*** 校验账户名和密码是否有效。* param account 用户输入的账户名。* param password 用户输入的密码。* return 如果账户名和密码有效返回true否则返回false。*/private boolean checkAccount(String account, String password) {if (account null || password null || account.isEmpty() || password.isEmpty()) {return false;}return true;}/*** 登录结果类封装登录是否成功和错误信息。*/public static class LoginResult {private boolean success;private String errorMessage;/*** 构造登录结果对象。* param success 登录是否成功。* param errorMessage 错误信息登录失败时提供。*/public LoginResult(boolean success, String errorMessage) {this.success success;this.errorMessage errorMessage;}/*** 判断登录是否成功。* return 登录成功返回true失败返回false。*/public boolean isSuccess() {return success;}/*** 设置登录是否成功。* param success 设置登录成功状态。*/public void setSuccess(boolean success) {this.success success;}/*** 获取错误信息。* return 错误信息字符串登录成功时为null。*/public String getErrorMessage() {return errorMessage;}/*** 设置错误信息。* param errorMessage 设置登录失败的错误信息。*/public void setErrorMessage(String errorMessage) {this.errorMessage errorMessage;}}}5.MainActivity
/*** 主活动类负责管理应用程序的主要界面。*/
public class MainActivity extends AppCompatActivity {private MainViewModel viewModel; // 视图模型用于管理活动背后的业务逻辑private ActivityMainBinding binding; // 数据绑定实例用于简化UI更新/*** 在活动创建时调用。* param savedInstanceState 如果活动之前被销毁这参数包含之前的状态。如果活动没被销毁之前这参数是null。*/Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 启用边缘到边缘的UIEdgeToEdge.enable(this);// 设置数据绑定binding DataBindingUtil.setContentView(this, R.layout.activity_main);// 设置视图的内边距以适应系统栏位的高度ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) - {Insets systemBars insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});// 初始化视图模型viewModel new ViewModelProvider(this).get(MainViewModel.class);// 从意图中获取账户信息Intent intent getIntent();String account intent.getStringExtra(account);// 将账户信息显示在文本视图上binding.text.setText(登录账户为account);}
}至此就完成了demo中展示的效果