使用 MVC 模式,实现简单登录功能 (Kotlin)
先放效果图:

第一张是登录页面效果图。用户输入登录名和密码,经过后台的非空验证和固定值验证,跳转到首页
第二张是首页效果图。用户点击 “update” 显示用户名和密码
这里的用户名和密码是后台设置的固定值,整体的登录逻辑特别简单,就是想通过登录来练手,学习mvc模式。
首先,创建相应的模型、视图和控制器类。
- Model (User.kt)
data class User(var username: String, var password: String) - View (LoginActivity.kt)
class LoginActivity : AppCompatActivity() {private lateinit var binding: ActivityLoginBindingprivate val loginController = LoginController()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = ActivityLoginBinding.inflate(layoutInflater)setContentView(binding.root)//初始化initData()}fun initData() {binding.loginBtnLogin.setOnClickListener {val userName = binding.loginEtName.text.toString()val passwd = binding.loginEtPwd.text.toString()if (loginController.validateCredentials(userName, passwd)) {Toast.makeText(this, "登录成功~", Toast.LENGTH_SHORT).show()val intent = Intent(this, MainActivity::class.java).apply {putExtra("input_text", userName)putExtra("input_pwd",passwd)}startActivity(intent)finish()} else {Toast.makeText(this, "登录失败~", Toast.LENGTH_SHORT).show()}}} } - Controller (LoginController.kt)
class LoginController {companion object {const val FIXED_USERNAME = "admin"const val FIXED_PASSWORD = "123123"}fun validateCredentials(username: String, password: String): Boolean {val isNotEmpty = username.isNotEmpty() && password.isNotEmpty()//验证用户名和密码是否为空val isFixedValue = username == FIXED_USERNAME && password == FIXED_PASSWORD//验证用户名和密码是否为固定值return isNotEmpty && isFixedValue} } - 布局文件 (activity_login.xml)
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".LoginActivity"><ImageViewandroid:id="@+id/login_imv"android:layout_width="88dp"android:layout_height="88dp"android:layout_marginTop="100dp"android:src="@drawable/login_logo"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><EditTextandroid:id="@+id/login_et_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:hint="请输入账号"android:minWidth="200dp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@+id/login_imv" /><EditTextandroid:id="@+id/login_et_pwd"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:hint="请输入密码"android:inputType="textPassword"android:minWidth="200dp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@+id/login_et_name" /><Buttonandroid:id="@+id/login_btn_login"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="登录"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@+id/login_et_pwd" /></androidx.constraintlayout.widget.ConstraintLayout>在 EditText 控件中,如果你想要在用户输入密码时隐藏内容,你可以使用
android:inputType="textPassword"属性。这会让输入的内容以点或星号的形式显示,而不是实际输入的字符。 -
下面简单写一下MainActivity.java 页面
class MainActivity : AppCompatActivity() {private lateinit var binding: ActivityMainBindingprivate lateinit var user: Useroverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)initData()}fun initData() {//初始化模型user = User("嘎嘎嘎", "gagaga")//设置按钮点击事件binding.btnUpdate.setOnClickListener {//更新模型user.name = intent.getStringExtra("input_text").toString()user.password = intent.getStringExtra("input_pwd").toString()//更新视图updateView()}}fun updateView() {binding.tvName.text = user.namebinding.tvEmail.text = user.password} } -
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="vertical"><TextViewandroid:id="@+id/tv_name"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"/><TextViewandroid:id="@+id/tv_email"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@+id/tv_name" /><Buttonandroid:id="@+id/btn_update"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@+id/tv_email"android:text="Update" /></androidx.constraintlayout.widget.ConstraintLayout>以上代码实现了一个简单的 MVC 模式的登录页面。用户在登录页面输入用户名和密码,然后通过 LoginController 进行验证。如果验证成功,用户将被重定向到主页面。如果验证失败,则会显示错误提示。效果如图:
-


-
注意:我的代码里面没有使用R.id.…… 而是用 ViewBinding 代替,主页有文章介绍了ViewBinding 感兴趣的小伙伴可以去主页看看。
-
下一篇文章,我们讲述:《ImageView控件怎么设置圆角和圆形》
相关文章:
使用 MVC 模式,实现简单登录功能 (Kotlin)
先放效果图: 第一张是登录页面效果图。用户输入登录名和密码,经过后台的非空验证和固定值验证,跳转到首页 第二张是首页效果图。用户点击 “update” 显示用户名和密码 这里的用户名和密码是后台设置的固定值,整体的登录逻辑特别…...
ASEMI代理LT8471IFE#PBF原装ADI车规级LT8471IFE#PBF
编辑:ll ASEMI代理LT8471IFE#PBF原装ADI车规级LT8471IFE#PBF 型号:LT8471IFE#PBF 品牌:ADI/亚德诺 封装:TSSOP-20 批号:2023 引脚数量:20 工作温度:-40C~125C 安装类型:表面…...
8. 100ASK_V853-PRO开发板支持MPP媒体处理平台
0.前言 MPP 系统控制模块,根据芯片特性,完成硬件各个部件的复位、基本初始化工作,同时负责完成 MPP(Media Process Platform 媒体处理平台)系统各个业务模块的初始化、去初始化以及管理 MPP 系统各个业务模块的工作…...
CLMP证书:让你在职场中脱颖而出的秘密武器!
CLMP证书是一种精益管理专业证书,是针对精益管理领域的专业人士和学生的培训项目,旨在提高他们在精益管理方面的技能和知识。那么,CLMP证书的含金量高吗?接下来我们来探讨一下。 CLMP证书的优势体现 首先,CLMP证书的…...
【从零开始】Docker Desktop:听说你小子要玩我
前言 🍊缘由 捡起遗忘的Docker知识 由于本狗近期项目紧任务重,高强度的搬砖导致摸鱼时间下降。在上线项目时,看到运维大神一系列骚操作,dockerk8s的知识如过眼云烟,忘得干净的很。所以想重新恶补一下docker知识&…...
制造业为什么要数字化?
制造业数字化,主要包含以下一些因素,有优势也有缺点: 制造业数字化的优势: 提高效率:数字化允许各种制造过程自动化,可以提高效率并降低成本。可以缩短生产时间、减少浪费并提高生产率。 增强质量控制&am…...
NPC 也有了生命?当 ChatGPT 注入游戏你能想象吗
🍎道阻且长,行则将至。🍓 目录 引言:西部世界元宇宙,还记得吗ChatGPT 的世界? 下图就是一个 ChatGPT 小镇: 引言:西部世界 《西部世界》以一个虚构的游戏般的“西部世界”为背景…...
Shell编程入门讲解
一.简介 Shell 是一个用 C 语言编写的命令行解释器,它是用户使用 Linux 的桥梁,它接受应用程序/用户命令,然后调用操作系统内核。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提…...
C++ 变量作用域
C 变量作用域 作用域是程序的一个区域,一般来说有三个地方可以定义变量: 在函数或一个代码块内部声明的变量,称为局部变量。 在函数参数的定义中声明的变量,称为形式参数。 在所有函数外部声明的变量,称为全局变量。…...
【状态未成功】CONFIG_CFI_CLANG失败过程记录
实现并没有成功,只是记录过程,使用4.9内核尝试开启过程 关于 控制流完整性 (CFI) 是一种安全机制,它不允许更改已编译二进制文件的原始控制流图,因而执行此类攻击变得异常困难。 在 Android 9 中,我们在更多组件以及内…...
基于消息调度优化启动速度方案实践
背景 在抖音的技术博客 https://juejin.cn/post/7080065015197204511#heading-10中,其介绍了通过修改消息队列顺序实现冷启动优化的方案,不过并未对其具体实现展开详细说明。 本文是对其技术方案的思考验证及实现。 详细代码见github: https://github.c…...
【C#】RemoveAt索引越界问题
系列文章 【C#】单号生成器(编号规则、固定字符、流水号、产生业务单号) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器(开始日期、结束日期) 本文链接:h…...
【华为OD机试2023】工位序列统计友好度最大值 100% C++ Java Python
【华为OD机试2023】工位序列统计友好度最大值 100% C++ Java Python 前言 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能最优),不能保证通过率。 Tips1:机试为ACM 模式 你的代码需要处理输入输出…...
Rust Atomics and Locks 阅读笔记 第二章 Atomics
原子操作(atomic operations)是多线程实现的基石,互斥锁(mutex)和条件变量(condition variable)都是通过原子操作来实现;std::sync::atomic包括了rust的内置原子操作类型(…...
Helm3入门
目录 Helm三大概念 Chart Repository Release Helm相关命令 helm 命令公共参数 helm search hub/repo - 查找可用的Charts helm repo - 仓库操作 helm install - 安装Chart helm status - 查看release状态 helm show values - 查看Chart的values.yaml内容 helm get…...
动态规划-线性动态规划-最长上升子序列模型
title: 线性动态规划 date: 2023-05-12 08:49:10 categories: Algorithm动态规划 tags:动态规划 编辑距离 题目描述 设 A A A 和 B B B 是两个字符串。我们要用最少的字符操作次数,将字符串 A A A 转换为字符串 B B B。这里所说的字符操作共有三种࿱…...
ResNet 论文理解含视频
ResNet 论文理解 论文理解 ResNet 网络的论文名字是《Deep Residual Learning for Image Recognition》,发表在2016年的 CVPR 上,获得了 最佳论文奖。ResNet 中的 Res 也是 Residual 的缩写,它的用意在于基于 残差 学习,让神经网…...
Java8之Stream操作
Java8之Stream操作 stream干啥用的?创建流中间操作终结操作好文推荐----接口优化思想 stream干啥用的? Stream 就是操作数据用的。使用起来很方便 创建流 → 中间操作 → 终结操作 Stream的操作可以分为两大类:中间操作、终结操作 中间操作可…...
二分查找基础篇-JAVA
文章目录 前言 大家好,我是最爱吃兽奶,这篇博客给大家介绍一下二分查找,我们先从最基本的开始讲解,再慢慢深入,把优化和变形也和大家说一下,那么,跟着我的步伐,我们一起去看看吧! 一、什么是二分查找? 二分查找(Binary Search)也称作折半查找 二分查找的效率很高,每查找一次…...
shell脚本5数组
文章目录 数组1 数组定义方法2 获取数组长度2.1 读取数组值2.2 数组切片2.3 数组替换2.4 数组删除2.5 追加数组元素 3 实验3.1 冒泡法3.2 直接选择法3.3 反排序法 数组 1 数组定义方法 数组名(value0 valuel value2 …) 数组名( [0]value [1]value [2]value …) 列表名“val…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
