Android-实现一个登录页面(kotlin)

news2024/9/20 18:43:21

 

准备工作

首先,确保你已经安装了 Android Studio。如果还没有安装,请访问 Android Studio 官网 下载并安装。

前提条件

- 安装并配置好 Android Studio

Android Studio Electric Eel | 2022.1.1 Patch 2
Build #AI-221.6008.13.2211.9619390, built on February 17, 2023
Runtime version: 11.0.15+0-b2043.56-9505619 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Windows 11 10.0
GC: G1 Young Generation, G1 Old Generation
Memory: 1280M
Cores: 6
Registry:
    external.system.auto.import.disabled=true
    ide.text.editor.with.preview.show.floating.toolbar=false
    ide.balloon.shadow.size=0

Non-Bundled Plugins:
    com.intuit.intellij.makefile (1.0.15)
    com.github.setial (4.0.2)
    com.alayouni.ansiHighlight (1.2.4)
    GsonOrXmlFormat (2.0)
    GLSL (1.19)
    com.mistamek.drawablepreview.drawable-preview (1.1.5)
    com.layernet.plugin.adbwifi (1.0.5)
    com.likfe.ideaplugin.eventbus3 (2020.0.2)

gradle-wrapper.properties

#Tue Apr 25 13:34:44 CST 2023
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

build.gradle(:Project)

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id 'com.android.application' version '7.3.1' apply false
    id 'com.android.library' version '7.3.1' apply false
    id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
}

setting.gradle

pluginManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}
rootProject.name = "logindemo"
include ':app'

- 对 Kotlin 语言有基本了解

创建新项目

首先,打开 Android Studio 并创建一个新项目。选择 "Empty Activity" 模板,然后为项目命名,例如 "LoginDemo"。接下来,选择 Kotlin 作为开发语言,并确保选择了合适的最小 SDK 版本。

 设计登录界面 在 `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">

    <EditText
        android:id="@+id/usernameEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="用户名"
        android:inputType="text" 
        app:layout_constraintTop_toTopOf="parent"/>

    <EditText
        android:id="@+id/passwordEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="密码"
        android:inputType="textPassword" 
        app:layout_constraintTop_toBottomOf="@+id/usernameEditText"/>

    <Button
        android:id="@+id/loginButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="登录" 
        app:layout_constraintTop_toBottomOf="@+id/passwordEditText"/>

</androidx.constraintlayout.widget.ConstraintLayout>

 

处理登录逻辑 在 `MainActivity.kt` 文件中,我们将处理登录按钮的点击事件。首先,获取输入框和按钮的引用,然后为按钮设置点击监听器。

package com.example.logindemo

import android.content.SharedPreferences
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    private lateinit var usernameEditText: EditText
    private lateinit var passwordEditText: EditText
    private lateinit var loginButton:Button
    private var sharedPreferences: SharedPreferences ?= null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        usernameEditText = findViewById(R.id.usernameEditText)
        passwordEditText = findViewById(R.id.passwordEditText)
        loginButton = findViewById(R.id.loginButton)

        sharedPreferences = getSharedPreferences("LoginDemo", MODE_PRIVATE)

        loginButton.setOnClickListener {
            val username = usernameEditText.text.toString()
            val password = passwordEditText.text.toString()

            if (validateInput(username, password)) {
                saveUserCredentials(username, password)
                Toast.makeText(this, "登录成功!", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this, "请输入有效的用户名和密码!", Toast.LENGTH_SHORT).show()
            }
        }
    }

    private fun validateInput(username: String, password: String): Boolean {
        return username.isNotEmpty() && password.isNotEmpty()
    }

    private fun saveUserCredentials(username: String, password: String) {
        val editor = sharedPreferences?.edit()
        editor?.putString("username", username)
        editor?.putString("password", password)
        editor?.apply()
    }
}

在上面的代码中,我们首先获取了输入框和按钮的引用。然后,我们创建了一个 SharedPreferences 实例来存储用户的登录信息。接下来,我们为登录按钮设置了一个点击监听器。当用户点击登录按钮时,我们检查输入的用户名和密码是否有效。如果有效,我们将用户的登录信息保存到 SharedPreferences 中,并显示一条提示消息。如果输入无效,我们会提示用户输入有效的用户名和密码。

学习如何在 Android 应用中实现登录功能。我们使用了 Android Studio 和 Kotlin 语言进行开发,并介绍了如何使用 SharedPreferences 存储用户信息。这只是一个简单的示例,实际应用中,可能需要将用户信息发送到服务器进行验证。

当然如果觉得SharedPreferences的封装程度不够,使用起来繁琐的话,也可以使用tencent的开源工具MMKV,高度封装的工具类可以更简单的来完成自己需要的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用命令行添加配置码云仓库SSH秘钥-git仓库也一样

使用命令行添加配置码云仓库SSH秘钥 为什么要如何使用命令行添加配置码云仓库SSH秘钥&#xff1f;生成密钥你可以按如下命令来生成 sshkey:可以参考下图执行指令 添加密钥登录你的码云&#xff0c;鼠标移入头像&#xff0c;设置。点击 SSH公钥&#xff0c;打开配置页面&#x…

新型数字智慧城市综合趋势解决方案(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 新型智慧城市解决方案总体架构 新型智慧城市顶层规划&#xff08;咨询&#xff09;服务概述 服务定义&#xff1a;提供面向城市及其产业的智慧化咨询服务&#xff0c;涵盖需求…

linux——进程的概念与状态

大家好&#xff0c;我是旗帜僵尸。今天我将带领大家学习进程的概念。 本篇文章将继续收录于我的linux专栏中&#xff0c;若想查看关于linux其它知识的文章也可以点击右方链接。旗帜僵尸——linux 文章目录 一、进程概念冯诺依曼体系结构OS&#xff08;操作系统Operator System&…

突破传统监测模式:业务状态监控HM的新思路

作者&#xff1a;京东保险 管顺利 一、传统监控系统的盲区&#xff0c;如何打造业务状态监控。 在系统架构设计中非常重要的一环是要做数据监控和数据最终一致性&#xff0c;关于一致性的补偿&#xff0c;已经由算法部的大佬总结过就不在赘述。这里主要讲如何去补偿&#xff…

电子阅读器市场角力,AI成为关键变量

配图来自Canva可画 近年来&#xff0c;随着国家“书香型社会”建设政策的出台&#xff0c;公众的阅读需求正在逐年增加&#xff0c;各类读书产品和读书活动&#xff0c;也如同雨后春笋般涌现&#xff0c;人们的阅读体验日益得到丰富。比如&#xff0c;昨天世界读书日举行的“不…

Photoshop在启动时出现读取计算机特定首选项时出错,或者提示暂存盘已满导致打不开该如何处理

上午还能用&#xff0c;下午打开Photoshop时就报此错误 点击确定后&#xff0c;出现下图错误 首先&#xff0c;先试试删除设置文件。在长按shiftctrlalt的情况下用鼠标右键点击Photoshop图标&#xff0c;点击打开&#xff08;此间别松手&#xff09;&#xff0c;就会出现下图&a…

“智慧赋能 强链塑链”|工程物资供应链管理中的数字化应用

工程项目中的供应链管理至关重要 工程建设行业是国民经济的重要支柱之一&#xff0c;虽然在总产值上持续保持增长态势&#xff0c;但近年来行业的利润总额增速已连续多年呈现下降趋势。究其原因&#xff0c;可以大体从两个方面来看&#xff1a;一是行业盈利能力出现下降&#x…

Xshell CentOs Linux命令2

上一次我们说了几个命令&#xff0c;文件的创建删除等&#xff0c;还有就是文件查看&#xff0c;今天我们继续看几个命令。 echo echo命令 我们看到我们在echo 后面跟一个字符串&#xff0c;不同会帮我们打印在屏幕上&#xff0c;这里我们需要补充一些东西&#xff0c;在Linu…

多线程常见的锁策略

目录 1.1 乐观锁 和 悲观锁 1.2 轻量级锁 和 重量级锁 1.3 自旋锁 和 挂起等待锁 1.4 互斥锁 和 读写锁 1.5 可重入锁 和 不可重入锁 1.6 公平锁 和 非公平锁 1.7 synchronized 锁的属性 一、锁策略 说到锁&#xff0c;Java 里面常用的锁有 synchronized &#xff0c;锁…

安全防御 --- 态势感知、VPN

一、态势感知 1、概念 态势感知&#xff08;SA --- Situational Awareness&#xff09;是对一定时间和空间内的环境元素进行感知&#xff0c;并对这个元素的含义进行理解&#xff0c;最终预测这些元素在未来的发展状态。 作用&#xff1a; 态势感知能够检测出超过20大类的云上…

使用nvm(node.js version management)安装管理nodejs

鉴于目前网络上关于NVM安装NodeJS操作步骤的文章&#xff0c;大家都在互相借鉴&#xff0c;很少看到原创文章&#xff0c;很多操作步骤已经冗余和过时。因此&#xff0c;本人根据实际的前端项目开发经验&#xff0c;在此重新梳理了一遍目前最新的NVMNodeJS的安装步骤&#xff0…

微信小程序原生开发功能合集十二:编辑界面的实现

本章实现编辑界面的实现处理,包括各编辑组件的使用及添加数据保存数据流程的实现处理。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下:    1. CSDN课程: https://edu.csdn.net/course/…

BOSHIDA 模块电源高低温试验箱测试原理

BOSHIDA 模块电源高低温试验箱测试原理 电源模块是可以直接贴装在印刷电路板上的电源供应器&#xff0c;其特点是可为专用集成电路&#xff08;ASIC&#xff09;、数字信号处理器 &#xff08;DSP&#xff09;、微处理器、存储器、现场可编程门阵列 &#xff08;FPGA&#xf…

OpenShift:关于OpenShift(OKD)通过命令行的方式部署镜像以及S2I流程Demo

写在前面 因为参加考试&#xff0c;会陆续分享一些 OpenShift 的笔记博文内容为安装完 OpenShift, 利用 OpenShift 引擎部署一个镜像应用和一个 S2I 流程部署应用 Demo学习环境为 openshift v3 的版本&#xff0c;有些旧这里如果专门学习 openshift &#xff0c;建议学习 v4 版…

【Idea】人工智能编程他来了,Idea集成一款和ChatGPT一样智能的编码辅助神器

文章目录 简介官方介绍功能介绍 注册使用使用方法功能说明 结尾 简介 Bito是一款建立在OpenAI和ChatGPT之上的开发辅助神器&#xff01;他可以帮我们生成代码、语法提示、生成测试用例、解释代码含义、生成注释、优化代码、检测代码安全性以及学习理论知识等&#xff01;我们可…

这可能是最全面的MySQL面试八股文了

什么是MySQL MySQL是一个关系型数据库&#xff0c;它采用表的形式来存储数据。你可以理解成是Excel表格&#xff0c;既然是表的形式存储数据&#xff0c;就有表结构&#xff08;行和列&#xff09;。行代表每一行数据&#xff0c;列代表该行中的每个值。列上的值是有数据类型的…

Ubuntu更新软件下载更新与移除

目录 一、更新软件源 二、下载与安装软件 三、如何移除软件 四、Ubuntu商店下载软件 一、更新软件源 更新Ubuntu软件源的操作步骤&#xff0c;更新软件源的目的就是&#xff0c;将在Ubuntu官网的软件源更改到本地&#xff0c;也就是国内的软件源&#xff0c;这样的话下载安…

北邮22信通:二叉树各种遍历所有常见算法汇总

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 获取更多文章 请访问专栏~ 北邮22信通_青山如墨雨如画的博客-CSDN博客 目录 1.二叉树的前序遍历 1.1递归算法 1.2非递归算法 1.2.1模板类实现栈 1.…

负载均衡的综合部署练习(LVS-DR模式+Nginx七层反向代理+Tomcat多实例)

1.实验设计 实验所满足的需求 满足某公司&#xff0c;想搭建一套高可用的负载均衡DR模式的集群&#xff0c;同时该集群收到用户访问请求时能够自主判断用户发送的请求是动态资源还是静态&#xff0c;依次划分进行动静分离&#xff1a;Nginx处理静态资源&#xff0c;Tomcat处理…

图的数据结构,系统学习图的基本概念、定义和建立,学会邻接矩阵、邻接表以及实现六度空间案例,遍历图的方式——广度、深度访问

1.图的定义和术语 图&#xff1a;G (V,E) Graph (Vertex, Edge) V&#xff1a;顶点&#xff08;数据元素&#xff09;的有穷非空集合&#xff1b; E&#xff1a;边的有穷集合。 有向图&#xff1a;每条边都是有方向的 无向图&#xff1a;每条边都是无方向的 完全图&#…