当前位置:   article > 正文

android studio kotlin实现登录、注册_kotlin实现app登录验证

kotlin实现app登录验证

实验内容:

  1. 实验实现3-4个Activity之间的跳转,包括注册页面、登录页面、好友列表页面等。实验必须使用两种以上的布局方式完成Acitivity的设计。
  2. 其中用户注册界面中需要出现8种以上的Android基本控件,并在Activity文件中对业务逻辑进行规范:如密码必须匹配,性别必须选择、年龄必须在一个合理范围内等等,当用户填写内容不正确时给出有效的提示。此界面可以做到国际化效果。可参照老师课堂上的案例。

实现好友列表界面,相应ListView中OnItemClick的点击事件。

实验步骤:

首先先新建一个项目。

1.登录页面:

(1)新建一个LoginActivity.kt文件,并在res目录的layout文件夹中创建activity_login.xml文件。有关登录页面的实现效果都在这两个文件中体现。

(2)先将布局方式改成RelativeLayout布局,如果想在页面中添加背景,可以添加android:background这个属性。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. tools:context=".LoginActivity">
  7. </RelativeLayout>

(3)添加文字和样式:设置TextView和EditText的id、宽度(layout_width)、高度(layout_height)、字体大小(textSize)、文本(text)、文字的对齐方式(gravity)、控件的对齐方式(layout_gravity)等。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. tools:context=".LoginActivity">
  7. <LinearLayout
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:orientation="vertical" >
  11. <TextView
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"
  14. android:id="@+id/big_login"
  15. android:textSize="40dp"
  16. android:text="登录"
  17. android:gravity="center"
  18. android:layout_gravity="center_vertical"
  19. android:layout_margin="30dp" />
  20. <!-- 手机号-->
  21. <LinearLayout
  22. android:layout_width="match_parent"
  23. android:layout_height="wrap_content"
  24. android:theme="@style/Layoutstyle">
  25. <TextView
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. android:id="@+id/text_name"
  29. android:text="手机号码:"
  30. android:textSize="22dp" />
  31. <EditText
  32. android:layout_width="match_parent"
  33. android:layout_height="wrap_content"
  34. android:id="@+id/username"
  35. android:layout_marginLeft="0dp"
  36. android:hint="请输入手机号"
  37. android:textColor="@color/black"
  38. android:gravity="center_vertical"
  39. android:textSize="25dp"/>
  40. </LinearLayout>
  41. <!-- 密码-->
  42. <LinearLayout
  43. android:layout_width="match_parent"
  44. android:layout_height="wrap_content"
  45. android:theme="@style/Layoutstyle">
  46. <TextView
  47. android:layout_width="wrap_content"
  48. android:layout_height="wrap_content"
  49. android:id="@+id/text_pwd"
  50. android:text="密\u3000\u3000码:"
  51. android:textSize="22dp"/>
  52. <EditText
  53. android:layout_width="match_parent"
  54. android:layout_height="wrap_content"
  55. android:id="@+id/pwd"
  56. android:hint="请输入密码"
  57. android:textColor="@color/black"
  58. android:gravity="center_vertical"
  59. android:inputType="textPassword"
  60. android:textSize="22dp"
  61. android:layout_marginLeft="0dp" />
  62. </LinearLayout>
  63. <!-- 登录-->
  64. <Button
  65. android:layout_width="200dp"
  66. android:layout_height="wrap_content"
  67. android:id="@+id/login"
  68. android:text="登录"
  69. android:textSize="25dp"
  70. android:gravity="center"
  71. android:layout_gravity="center"/>
  72. <!-- 还未注册,去注册-->
  73. <TextView
  74. android:layout_width="match_parent"
  75. android:layout_height="wrap_content"
  76. android:id="@+id/register"
  77. android:text="还未注册?去注册"
  78. android:textSize="18dp"
  79. android:gravity="center"
  80. android:layout_gravity="center" />
  81. </LinearLayout>
  82. </RelativeLayout>

在上面这个xml文件中,我在res/values/themes.xml中把具有公共属性的样式写在一起,便于多次使用相同属性时可以减少工作量,以提高代码的复用率。使用时添加android:theme="@style/Layoutstyle"这个属性即可。

  1. <!-- LinearLayout-->
  2. <style name="Layoutstyle" parent="Theme.AppCompat.Light">
  3. <item name="android:layout_marginRight">30dp</item>
  4. <item name="android:layout_marginLeft">30dp</item>
  5. <item name="android:layout_marginBottom">20dp</item>
  6. <item name="android:orientation">horizontal</item>
  7. <item name="android:gravity">center</item>
  8. <item name="android:layout_gravity">center_vertical</item>
  9. </style>

可以在xml文件的右上角的位置,查看当前文件的页面布局样式:

(4)在LoginActivity.kt文件中要继承AppCompatActivity这个方法:

首先先定义控件id,然后在登录按钮添加点击事件,判断所输入的内容不能为空,如果输入预设置的手机号码和密码都正确,方可跳转到主页。点击“还未注册?去注册”文字,也可以跳到注册页面(前提是需要有RegisterActivity.kt和activity_register.xml),不然会报错。

  1. class LoginActivity:AppCompatActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. setContentView(R.layout.activity_login)
  5. val username:EditText=findViewById(R.id.username)
  6. val pwd:EditText=findViewById(R.id.pwd)
  7. // 验证,点击登录
  8. val login:Button=findViewById(R.id.login)
  9. login.setOnClickListener{
  10. val str_name=username.text.toString()
  11. val str_pwd=pwd.text.toString()
  12. // 判断输入是否正确
  13. if (str_name.isEmpty()){
  14. username.setError("手机号不能为空")
  15. }
  16. if (str_pwd.isEmpty()){
  17. pwd.setError("密码不能为空")
  18. }
  19. // 登录成功,进入主页
  20. if (str_name.equals("13456789028") && str_pwd.equals("123")){
  21. val intent=Intent(this,MainActivity::class.java)
  22. startActivity(intent)
  23. }
  24. }
  25. // 还未注册?去注册
  26. val register:TextView=findViewById(R.id.register)
  27. register.setOnClickListener{
  28. val intent=Intent(this,RegisterActivity::class.java)
  29. startActivity(intent)
  30. }
  31. }
  32. }

如果在运行时出现闪退的问题,其中有一种可能是,AndroidManifest.xml中没有对已创建的kt文件进行注册,只需要对Activity文件添加注册即可:<activity android:name=".LoginActivity" android:exported="false"></activity>

运行完成后的效果图如下:

为此,简单的登录界面就实现了。

2.注册页面:

注册的实现逻辑和登录的差不多,只是注册页面所需要的功能控件多一点,相应的业务处理逻辑也相对多一点。

(1)编写activity_register.xml文件的内容:

                 在注册页面,我实现了8种控件:图片(ImageView)、文本框(TextView)、可编辑文本(EditText)、单选按钮(RadioGroup)、下拉框(Spinner)、自动完成文本框(AutoCompleteTextView)、复选框(CheckBox)、按钮(Button)

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. tools:context=".RegisterActivity">
  7. <LinearLayout
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:orientation="vertical">
  11. <!-- 头像图片-->
  12. <LinearLayout
  13. android:layout_width="match_parent"
  14. android:layout_height="match_parent"
  15. android:orientation="horizontal"
  16. android:gravity="center">
  17. <ImageView
  18. android:id="@+id/avatar_img"
  19. android:layout_width="100dp"
  20. android:layout_height="100dp"
  21. android:src="@drawable/avatar"
  22. android:layout_centerInParent="true"
  23. android:layout_gravity="center"
  24. android:layout_margin="30dp"/>
  25. </LinearLayout>
  26. <!-- 用户名-->
  27. <LinearLayout
  28. android:layout_width="match_parent"
  29. android:layout_height="wrap_content"
  30. android:theme="@style/Layoutstyle">
  31. <TextView
  32. android:layout_width="wrap_content"
  33. android:layout_height="wrap_content"
  34. android:id="@+id/text_name"
  35. android:text="手机号码:"
  36. android:textSize="22dp" />
  37. <EditText
  38. android:layout_width="match_parent"
  39. android:layout_height="wrap_content"
  40. android:id="@+id/username"
  41. android:hint="请输入手机号"
  42. android:gravity="center_vertical"
  43. android:textSize="22dp"
  44. android:layout_marginLeft="0dp"
  45. android:textColor="@color/black"/>
  46. </LinearLayout>
  47. <!-- 密码-->
  48. <LinearLayout
  49. android:layout_width="match_parent"
  50. android:layout_height="wrap_content"
  51. android:theme="@style/Layoutstyle">
  52. <TextView
  53. android:layout_width="wrap_content"
  54. android:layout_height="wrap_content"
  55. android:id="@+id/text_pwd"
  56. android:text="密\u3000\u3000码:"
  57. android:textSize="22dp"/>
  58. <EditText
  59. android:layout_width="match_parent"
  60. android:layout_height="wrap_content"
  61. android:id="@+id/pwd"
  62. android:hint="请输入密码"
  63. android:gravity="center_vertical"
  64. android:textSize="22dp"
  65. android:layout_marginLeft="0dp"
  66. android:inputType="textPassword"
  67. android:textColor="@color/black"/>
  68. </LinearLayout>
  69. <!-- 确认密码-->
  70. <LinearLayout
  71. android:layout_width="match_parent"
  72. android:layout_height="wrap_content"
  73. android:theme="@style/Layoutstyle" >
  74. <TextView
  75. android:layout_width="wrap_content"
  76. android:layout_height="wrap_content"
  77. android:id="@+id/text_confirm_pwd"
  78. android:text="确认密码:"
  79. android:textSize="22dp" />
  80. <EditText
  81. android:layout_width="match_parent"
  82. android:layout_height="wrap_content"
  83. android:id="@+id/confirm_pwd"
  84. android:hint="请确认密码"
  85. android:gravity="center_vertical"
  86. android:textSize="22dp"
  87. android:layout_marginLeft="0dp"
  88. android:inputType="textPassword"
  89. android:textColor="@color/black" />
  90. </LinearLayout>
  91. <!-- 性别-->
  92. <LinearLayout
  93. android:layout_width="match_parent"
  94. android:layout_height="wrap_content"
  95. android:layout_marginRight="30dp"
  96. android:layout_marginBottom="20dp"
  97. android:layout_marginLeft="30dp"
  98. android:orientation="horizontal"
  99. android:gravity="center_vertical">
  100. <TextView
  101. android:layout_width="wrap_content"
  102. android:layout_height="wrap_content"
  103. android:id="@+id/sex"
  104. android:text="性\u3000\u3000别:"
  105. android:textSize="22dp" />
  106. <!-- 单选按钮:男-->
  107. <RadioGroup
  108. android:layout_width="wrap_content"
  109. android:layout_height="wrap_content"
  110. android:orientation="horizontal"
  111. android:layout_marginLeft="30dp">
  112. <RadioButton
  113. android:layout_width="wrap_content"
  114. android:layout_height="wrap_content"
  115. android:id="@+id/male_sex"
  116. android:text="男"
  117. android:checked="true"
  118. android:textSize="22dp"
  119. android:layout_marginRight="20dp" />
  120. <!-- 单选按钮:女-->
  121. <RadioButton
  122. android:layout_width="wrap_content"
  123. android:layout_height="wrap_content"
  124. android:id="@+id/female_sex"
  125. android:text="女"
  126. android:textSize="22dp" />
  127. </RadioGroup>
  128. </LinearLayout>
  129. <!-- 所在城市-->
  130. <LinearLayout
  131. android:layout_width="match_parent"
  132. android:layout_height="wrap_content"
  133. android:layout_marginRight="30dp"
  134. android:layout_marginBottom="20dp"
  135. android:layout_marginLeft="30dp"
  136. android:orientation="horizontal"
  137. android:gravity="center_vertical">
  138. <TextView
  139. android:layout_width="wrap_content"
  140. android:layout_height="wrap_content"
  141. android:text="所在城市:"
  142. android:textSize="22dp" />
  143. <Spinner
  144. android:id="@+id/sp_city"
  145. android:layout_width="160dp"
  146. android:layout_height="wrap_content"
  147. android:textAlignment="center"
  148. android:theme="@style/spinner"
  149. />
  150. </LinearLayout>
  151. <!-- 毕业院校-->
  152. <LinearLayout
  153. android:layout_width="match_parent"
  154. android:layout_height="wrap_content"
  155. android:layout_marginRight="30dp"
  156. android:layout_marginBottom="20dp"
  157. android:layout_marginLeft="30dp"
  158. android:orientation="horizontal"
  159. android:gravity="center_vertical">
  160. <TextView
  161. android:layout_width="wrap_content"
  162. android:layout_height="wrap_content"
  163. android:text="毕业院校:"
  164. android:textSize="22dp" />
  165. <AutoCompleteTextView
  166. android:id="@+id/actv_uni"
  167. android:layout_width="200dp"
  168. android:layout_height="wrap_content"
  169. android:textColor="@color/black" />
  170. </LinearLayout>
  171. <!-- 复选框:勾选协议-->
  172. <LinearLayout
  173. android:layout_width="match_parent"
  174. android:layout_height="wrap_content"
  175. android:layout_marginRight="30dp"
  176. android:layout_marginBottom="20dp"
  177. android:layout_marginLeft="30dp"
  178. android:orientation="horizontal"
  179. android:gravity="center_vertical">
  180. <CheckBox
  181. android:id="@+id/check_read"
  182. android:layout_width="wrap_content"
  183. android:layout_height="wrap_content"
  184. android:text="已阅读协议"
  185. android:textSize="26dp"
  186. android:inputType="number"
  187. />
  188. </LinearLayout>
  189. <!-- 注册-->
  190. <Button
  191. android:layout_width="200dp"
  192. android:layout_height="wrap_content"
  193. android:id="@+id/register"
  194. android:text="注册"
  195. android:textSize="25dp"
  196. android:gravity="center"
  197. android:layout_gravity="center"/>
  198. <!-- 已有账号,请登录-->
  199. <TextView
  200. android:layout_width="match_parent"
  201. android:layout_height="wrap_content"
  202. android:id="@+id/login"
  203. android:text="已有账号,请登录"
  204. android:textSize="18dp"
  205. android:gravity="center"
  206. android:layout_gravity="center" />
  207. </LinearLayout>
  208. </RelativeLayout>

在RegisterActivity.kt文件中对各个控件进行逻辑处理.

  1. class RegisterActivity: AppCompatActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. setContentView(R.layout.activity_register)
  5. val username:EditText=findViewById(R.id.username)
  6. val pwd:EditText=findViewById(R.id.pwd)
  7. val confirm_pwd:EditText=findViewById(R.id.confirm_pwd)
  8. val check_read:CheckBox=findViewById(R.id.check_read)
  9. //spinner
  10. val sp_city: Spinner = findViewById(R.id.sp_city)
  11. val sp_data = arrayOf("佛山", "广州", "深圳", "汕头", "清远", "云浮", "东莞","珠海","江门","中山","河源","湛江","茂名","揭阳")
  12. val sp_adapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, sp_data)
  13. sp_city.adapter = sp_adapter
  14. //AutoComleteTextView
  15. val act_uni: AutoCompleteTextView = findViewById(R.id.actv_uni)
  16. val actv_data = arrayOf("暨南大学","广东海洋大学", "广东工业大学", "广东财经大学","广东医科大学")
  17. val act_adapter= ArrayAdapter(this,android.R.layout.simple_list_item_1,actv_data)
  18. act_uni.setAdapter(act_adapter)
  19. // 验证,点击注册
  20. val register:TextView=findViewById(R.id.register)
  21. register.setOnClickListener{
  22. val str_name=username.text.toString()
  23. val str_pwd=pwd.text.toString()
  24. val str_confirm_pwd=confirm_pwd.text.toString()
  25. val str_check_read=check_read.text.toString()
  26. // 手机号校验
  27. val username_regex:Regex= "[1][34578]\\d{9}".toRegex()
  28. // 密码校验:密码为6~16位数字,英文,符号至少两种组合的字符
  29. val pwd_regex:Regex="^(?![0-9]+$)(?![a-zA-Z]+$)(?!([^(0-9a-zA-Z)]|[\\(\\)])+$)([^(0-9a-zA-Z)]|[\\(\\)]|[a-zA-Z]|[0-9]){6,16}$".toRegex()
  30. // 判断输入是否正确
  31. if (str_name.isEmpty()){
  32. username.setError("手机号不能为空")
  33. } else if (str_name.matches(username_regex)){
  34. }else{
  35. username.setError("请输入正确的手机号")
  36. }
  37. if (str_pwd.isEmpty()){
  38. pwd.setError("密码不能为空")
  39. }else if (str_pwd.matches(pwd_regex)){
  40. }else{
  41. pwd.setError("密码为6~16位数字,英文,符号至少两种组合的字符")
  42. }
  43. if (str_confirm_pwd.isEmpty()){
  44. confirm_pwd.setError("确认密码不能为空")
  45. }
  46. if (!str_confirm_pwd.equals(str_pwd)){
  47. confirm_pwd.setError("两次密码必须保持一致")
  48. }
  49. }
  50. // 点击登录,跳转到登录页面
  51. val login:TextView=findViewById(R.id.login)
  52. login.setOnClickListener{
  53. val intent=Intent(this, LoginActivity::class.java)
  54. startActivity(intent)
  55. }
  56. }
  57. }

运行完成后的效果图如下:

为此,注册界面也实现了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/901323
推荐阅读
相关标签
  

闽ICP备14008679号