使用 MVC 模式,实现简单登录功能 (Kotlin)

news/2024/11/17 21:45:15/

先放效果图:

    

第一张是登录页面效果图。用户输入登录名和密码,经过后台的非空验证和固定值验证,跳转到首页

第二张是首页效果图。用户点击 “update” 显示用户名和密码

这里的用户名和密码是后台设置的固定值,整体的登录逻辑特别简单,就是想通过登录来练手,学习mvc模式。

首先,创建相应的模型、视图和控制器类。

  1. Model (User.kt)
    data class User(var username: String, var password: String)
    
  2. 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()}}}
    }
  3. 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}
    }
  4. 布局文件 (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" 属性。这会让输入的内容以点或星号的形式显示,而不是实际输入的字符。

  5. 下面简单写一下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}
    }

  6. 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 进行验证。如果验证成功,用户将被重定向到主页面。如果验证失败,则会显示错误提示。效果如图:

  7. 注意:我的代码里面没有使用R.id.…… 而是用 ViewBinding 代替,主页有文章介绍了ViewBinding 感兴趣的小伙伴可以去主页看看。

  8. 下一篇文章,我们讲述:《ImageView控件怎么设置圆角和圆形》


http://www.ppmy.cn/news/402939.html

相关文章

除夕主题的静态网站

前言 这个静态网站是当初自学HTML的时候制作的第一个网站&#xff0c;是以2022年虎年除夕为主题的&#xff0c;一共有五个页面&#xff08;首页、习俗、年货、旅游、电影&#xff09;。主要目的是用来学习相关的HTML知识和巩固一些基本的概念&#xff0c;废话不多说&#xff0c…

MNN量化—ADMM优化算法

作者&#xff1a;糖心他爸 链接&#xff1a;https://zhuanlan.zhihu.com/p/81243626 来源&#xff1a;知乎 目录 量化的模型建立 ADMM算法 量化的模型建立 现在我们知道了如何做量化推断&#xff0c;下一步是如何去建立量化模型&#xff0c;或者说我们应该用一个什么样的方…

matlab 特征检测,苹果的特征检测与matlab实现-read.doc

苹果的特征检测与matlab实现-read 苹果的特征检测与MATLAB实现 摘 要 ?本文选取了可用于苹果分级的部分特征&#xff0c;并在Matlab上进行试验检测。该方法可以对苹果的外部缺陷、果梗、尺寸和形状进行全面的检测&#xff0c;在此基础上可对苹果进行高速和精确的分级。 关键词…

for循环打印爱心

1.代码 #include<stdio.h> #include"Windows.h" int main() {int i,j,k,n,m,a,b;for(i1;i<3;i) {if(i1){printf(" "); printf("*****");printf(" ");printf("*****"); }e…

Android商城开发--实现商城底部导航栏

让我们先看效果图&#xff1a; 图一是默认效果图&#xff0c;图二是点击首页的效果图&#xff08;图标和字体颜色会变化&#xff09; 接下来是实现方法 1、先写布局。 我新建了一个ShoppingActivity&#xff0c;在activity_shopping.xml文件中&#xff0c;写整体布局&#x…

Servlet 学习笔记3

一、HttpServletRequest类 a&#xff09;HttpServletRequest类的作用 每次只要有请求进入Tomcat服务器&#xff0c;Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中&#xff0c;然后传递到service&#xff0c;doGet&#xff0c;doPost方法中。我们可以通…

那些年吃过的点心

豆沙粑粑和椒盐饼东西算是小时候比较著名和难忘的点心了&#xff0c;比较出名的绿豆糕反而没有什么好感。 豆沙粑粑就是死面皮包豆沙打扁了&#xff0c;类似于昆明的官渡粑粑&#xff0c;不过馅是豆沙而已&#xff0c;微甜&#xff1b; 豆沙粑粑.jpg 椒盐饼就像一个压扁了花卷&…

pkg_resources.DistributionNotFound: The ‘tzlocal>=1.2‘ distribution was not found and is required by

PyInstaller打包APscheduler出现&#xff1a;pkg_resources.DistributionNotFound: The xxx>yyy distribution was not found and is required by the application 1.软件环境⚙️2.问题描述&#x1f50d;3.解决方法&#x1f421;3.1.添加APScheduler依赖项的元数据 4.结果预…