当前位置:   article > 正文

安卓实现一个引导页+登录界面并连接SQLite_android开发登录界面详细代码以及连接数据库

android开发登录界面详细代码以及连接数据库

一、引导页

实现效果: 

我们先书写一个条目

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <!-- 这是引导图片的图像视图 -->
  6. <ImageView
  7. android:id="@+id/iv_launch"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. android:scaleType="fitXY" />
  11. <!-- 这里容纳引导页底部的一排圆点 -->
  12. <RadioGroup
  13. android:id="@+id/rg_indicate"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:layout_alignParentBottom="true"
  17. android:layout_centerHorizontal="true"
  18. android:orientation="horizontal"
  19. android:paddingBottom="20dp" />
  20. <!-- 这是最后一页的入口按钮 -->
  21. <Button
  22. android:id="@+id/btn_start"
  23. android:layout_width="wrap_content"
  24. android:layout_height="wrap_content"
  25. android:layout_centerInParent="true"
  26. android:text="立即开始使用"
  27. android:textColor="#ff3300"
  28. android:textSize="22sp"
  29. android:visibility="gone" />
  30. </RelativeLayout>

现在我们就定义了一个条目,他由背景图片,底部原点,和按钮组成,我们用Adapter放入活动页面中,其中我们使用ViewPager,当我们滑动至下一页中,就高亮底部按钮,当遍历至最后一页中再显示按钮,否则就隐藏

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".LaunchSimpleActivity">
  8. <androidx.viewpager.widget.ViewPager
  9. android:id="@+id/vp_launch"
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent"/>
  12. </LinearLayout>

在适配器中书写逻辑

  1. package com.example.androidapp.adapter;
  2. import android.content.Context;
  3. import android.content.Intent;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.Button;
  8. import android.widget.ImageView;
  9. import android.widget.RadioButton;
  10. import android.widget.RadioGroup;
  11. import androidx.annotation.NonNull;
  12. import androidx.viewpager.widget.PagerAdapter;
  13. import com.example.androidapp.LoginActivity;
  14. import com.example.androidapp.R;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. public class LaunchSimpleAdapter extends PagerAdapter {
  18. private List<View> mViewList = new ArrayList<>();
  19. public LaunchSimpleAdapter(Context context, int[] imageArray) {
  20. for (int i = 0; i < imageArray.length; i++) {
  21. View view = LayoutInflater.from(context).inflate(R.layout.item_launch, null);
  22. ImageView iv_launch = view.findViewById(R.id.iv_launch);
  23. RadioGroup rg_indicate = view.findViewById(R.id.rg_indicate);
  24. Button btn_start = view.findViewById(R.id.btn_start);
  25. iv_launch.setImageResource(imageArray[i]);
  26. // 每个页面都分配一组对应的单选按钮
  27. for (int j = 0; j < imageArray.length; j++) {
  28. RadioButton radio = new RadioButton(context);
  29. radio.setLayoutParams(new ViewGroup.LayoutParams(
  30. ViewGroup.LayoutParams.WRAP_CONTENT,
  31. ViewGroup.LayoutParams.WRAP_CONTENT
  32. ));
  33. radio.setPadding(10,10,10,10);
  34. rg_indicate.addView(radio);
  35. }
  36. // 当前位置的单选按钮要高亮显示,比如第二个引导页就高亮第二个单选按钮
  37. ((RadioButton)rg_indicate.getChildAt(i)).setChecked(true);
  38. // 如果是最后一个引导页,则显示入口按钮,以便用户点击按钮进入主页
  39. if (i == imageArray.length - 1){
  40. btn_start.setVisibility(View.VISIBLE);
  41. btn_start.setOnClickListener(v -> {
  42. Intent intent = new Intent(context, LoginActivity.class);
  43. context.startActivity(intent);
  44. });
  45. }
  46. mViewList.add(view);
  47. }
  48. }
  49. @Override
  50. public int getCount() {
  51. return mViewList.size();
  52. }
  53. @Override
  54. public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
  55. //在这里,view是我们添加的,object是下方生命周期函数返回的
  56. return view == object;
  57. }
  58. //实例化指定位置的页面,并将其添加到容器中
  59. @NonNull
  60. @Override
  61. public Object instantiateItem(@NonNull ViewGroup container, int position) {
  62. //根据position拿到item
  63. View item = mViewList.get(position);
  64. container.addView(item);
  65. //返回一个跟这个view可以关联起来的对象,这里直接将自己返回就可以了,可以将view和object关联起来
  66. return item;
  67. }
  68. //从容器中销毁指定位置的页面
  69. @Override
  70. public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
  71. container.removeView(mViewList.get(position));
  72. }
  73. }

 将适配器携带图片数据传入引导页主活动

  1. package com.example.androidapp;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import androidx.viewpager.widget.ViewPager;
  4. import android.os.Bundle;
  5. import com.example.androidapp.adapter.LaunchSimpleAdapter;
  6. public class LaunchSimpleActivity extends AppCompatActivity {
  7. // 声明引导页面的图片数组
  8. private int[] launchImageArray = {R.drawable.guide_bg1,
  9. R.drawable.guide_bg2, R.drawable.guide_bg3, R.drawable.guide_bg4};
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_launch_simple);
  14. ViewPager vp_launch = findViewById(R.id.vp_launch);
  15. LaunchSimpleAdapter adapter = new LaunchSimpleAdapter(this,launchImageArray);
  16. vp_launch.setAdapter(adapter);
  17. }
  18. }

二、登录页面

我们先定义一个登录页布局和注册页布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:gravity="center"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:background="@drawable/background">
  7. <TableRow
  8. android:gravity="center"
  9. android:layout_marginHorizontal="30dp">
  10. <TextView
  11. android:text="用户名:"
  12. android:textSize="20sp"
  13. android:textColor="@color/white"/>
  14. <EditText
  15. android:id="@+id/et_log_admin"
  16. android:hint="请输入用户名"
  17. android:background="@drawable/editext_selector"
  18. android:textColorHint="@color/gary"
  19. android:textColor="@color/white"
  20. android:layout_weight="1"/>
  21. </TableRow>
  22. <TableRow
  23. android:gravity="center"
  24. android:layout_marginTop="20dp"
  25. android:layout_marginHorizontal="30dp">
  26. <TextView
  27. android:text="密码:"
  28. android:textColor="@color/white"
  29. android:textSize="20sp"
  30. android:gravity="end"/>
  31. <EditText
  32. android:id="@+id/et_log_pass"
  33. android:hint="请输入登录密码"
  34. android:background="@drawable/editext_selector"
  35. android:textColorHint="@color/gary"
  36. android:layout_weight="1"/>
  37. </TableRow>
  38. <LinearLayout
  39. android:layout_marginTop="30dp"
  40. android:orientation="horizontal"
  41. android:gravity="center">
  42. <Button
  43. android:id="@+id/bt_login"
  44. android:text="登录"
  45. android:layout_marginEnd="50dp"
  46. android:layout_width="100dp"
  47. android:layout_height="50dp"/>
  48. <Button
  49. android:id="@+id/bt_register"
  50. android:text="注册"
  51. android:layout_width="100dp"
  52. android:layout_height="50dp"/>
  53. </LinearLayout>
  54. </TableLayout>
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <TextView
  7. android:text="用户注册"
  8. android:textSize="30sp"
  9. android:textColor="@color/black"
  10. android:textStyle="bold"
  11. android:lines="2"
  12. android:gravity="center"
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"/>
  15. <RelativeLayout
  16. android:layout_width="match_parent"
  17. android:layout_height="wrap_content">
  18. <TableLayout
  19. android:layout_width="match_parent"
  20. android:layout_height="wrap_content">
  21. <TableRow android:layout_marginTop="10dp">
  22. <TextView
  23. android:text="用户名:"
  24. android:textSize="20sp"
  25. android:textColor="@color/black"
  26. android:drawableStart="@drawable/baseline_perm_identity_black_24dp"
  27. android:layout_weight="0.1"/>
  28. <EditText
  29. android:id="@+id/et_reg_admin"
  30. android:inputType="textPersonName"
  31. android:layout_weight="0.9"/>
  32. </TableRow>
  33. <TableRow android:layout_marginTop="10dp">
  34. <TextView
  35. android:text="密码:"
  36. android:textSize="20sp"
  37. android:textColor="@color/black"
  38. android:drawableStart="@drawable/baseline_lock_black_24dp"
  39. android:layout_weight="0.1"/>
  40. <EditText
  41. android:id="@+id/et_reg_pass"
  42. android:layout_weight="0.9"/>
  43. </TableRow>
  44. <TableRow android:layout_marginTop="10dp">
  45. <TextView
  46. android:text="确认密码:"
  47. android:textSize="20sp"
  48. android:textColor="@color/black"
  49. android:drawableStart="@drawable/baseline_vpn_key_black_24dp"
  50. android:layout_weight="0.1"/>
  51. <EditText
  52. android:id="@+id/et_reg_checkpass"
  53. android:layout_weight="0.9"/>
  54. </TableRow>
  55. <TableRow android:layout_marginTop="10dp">
  56. <TextView
  57. android:text="年龄:"
  58. android:textSize="20sp"
  59. android:textColor="@color/black"
  60. android:drawableStart="@drawable/baseline_date_range_black_24dp"
  61. android:layout_weight="0.1"/>
  62. <EditText
  63. android:id="@+id/et_reg_age"
  64. android:inputType="number"
  65. android:layout_weight="0.9"/>
  66. </TableRow>
  67. <TableRow android:layout_marginTop="10dp">
  68. <TextView
  69. android:text="电话:"
  70. android:textSize="20sp"
  71. android:textColor="@color/black"
  72. android:drawableStart="@drawable/baseline_phone_black_24dp"
  73. android:layout_weight="0.1"/>
  74. <EditText
  75. android:id="@+id/et_reg_tel"
  76. android:inputType="phone"
  77. android:layout_weight="0.9"/>
  78. </TableRow>
  79. <TableRow android:layout_marginTop="10dp">
  80. <TextView
  81. android:text="家庭地址:"
  82. android:textSize="20sp"
  83. android:textColor="@color/black"
  84. android:drawableStart="@drawable/baseline_home_black_24dp"
  85. android:layout_weight="0.1"/>
  86. <EditText
  87. android:id="@+id/et_reg_address"
  88. android:layout_weight="0.9"/>
  89. </TableRow>
  90. <TableRow
  91. android:layout_marginTop="10dp"
  92. android:gravity="center">
  93. <TextView
  94. android:text="性别:"
  95. android:textSize="20sp"
  96. android:textColor="@color/black"
  97. android:drawableStart="@drawable/baseline_face_blue_900_24dp"
  98. android:layout_weight="0.1"/>
  99. <RadioGroup
  100. android:orientation="horizontal"
  101. android:layout_weight="0.9">
  102. <RadioButton
  103. android:id="@+id/rb_boy"
  104. android:text="男"
  105. android:textSize="20sp"
  106. android:layout_marginEnd="20dp"
  107. android:layout_width="wrap_content"
  108. android:layout_height="wrap_content"/>
  109. <RadioButton
  110. android:id="@+id/rb_girl"
  111. android:text="女"
  112. android:textSize="20sp"
  113. android:layout_width="wrap_content"
  114. android:layout_height="wrap_content"/>
  115. </RadioGroup>
  116. </TableRow>
  117. </TableLayout>
  118. <View
  119. android:id="@+id/view"
  120. android:layout_width="0dp"
  121. android:layout_height="match_parent"
  122. android:layout_centerHorizontal="true"/>
  123. <Button
  124. android:id="@+id/bt_register"
  125. android:text="确定"
  126. android:layout_marginTop="450dp"
  127. android:layout_marginEnd="40dp"
  128. android:layout_toStartOf="@id/view"
  129. android:layout_width="100dp"
  130. android:layout_height="50dp"/>
  131. <Button
  132. android:id="@+id/bt_cancel"
  133. android:text="取消"
  134. android:layout_marginTop="450dp"
  135. android:layout_marginStart="40dp"
  136. android:layout_toEndOf="@id/view"
  137. android:layout_width="100dp"
  138. android:layout_height="50dp"/>
  139. </RelativeLayout>
  140. </LinearLayout>

登录页          注册页

我们先来看注册过程,大致的内容就是

我们点击确定按钮时就触发事件,创建一个字符串数组用于存放以上信息,当每条信息不为空时,插入到client表中,首先我们需要user类

  1. package com.example.androidapp.entity;
  2. import java.io.Serializable;
  3. //User类,含有用户名和密码。在bundle数据包中要放入自定义数据类型,需要实现序列化接口
  4. public class User implements Serializable {
  5. private String login;
  6. private String pass;
  7. public User(){
  8. }
  9. public User(String login, String pass) {
  10. this.login = login;
  11. this.pass = pass;
  12. }
  13. public String getLogin() {
  14. return login;
  15. }
  16. public void setLogin(String login) {
  17. this.login = login;
  18. }
  19. public String getPass() {
  20. return pass;
  21. }
  22. public void setPass(String pass) {
  23. this.pass = pass;
  24. }
  25. }

当我们注册完之后,信息就存在bundle数据包中,数据包再存入intent意图中,在登陆界面中就根据数据包中的键值对来获取信息直接添加到输入栏中

  1. package com.example.androidapp;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.database.Cursor;
  5. import android.database.sqlite.SQLiteDatabase;
  6. import android.os.Bundle;
  7. import android.util.Log;
  8. import android.view.View;
  9. import android.widget.EditText;
  10. import android.widget.RadioButton;
  11. import androidx.appcompat.app.AppCompatActivity;
  12. import com.example.androidapp.entity.User;
  13. import com.example.androidapp.database.ApplicationSqLite;
  14. public class RegisterActivity extends AppCompatActivity {
  15. private SQLiteDatabase sqLiteDB;//数据库对象(包含操作数据库的方法)
  16. private Cursor cursor;//结果集对象(用作接收查询结果)
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_register);
  21. //获取数据库对象
  22. sqLiteDB = ApplicationSqLite.getDB();
  23. this.findViewById(R.id.bt_register).setOnClickListener(new View.OnClickListener() {
  24. @Override
  25. public void onClick(View v) {
  26. String[] args = new String[6];
  27. //用户名
  28. EditText et_reg_admin = RegisterActivity.this.findViewById(R.id.et_reg_admin);
  29. args[0] = et_reg_admin.getText().toString();
  30. //密码
  31. EditText et_reg_pass = RegisterActivity.this.findViewById(R.id.et_reg_pass);
  32. args[1] = et_reg_pass.getText().toString();
  33. EditText et_reg_checkpass = RegisterActivity.this.findViewById(R.id.et_reg_checkpass);
  34. String checkpass = et_reg_checkpass.getText().toString();
  35. //年龄
  36. EditText et_reg_age = RegisterActivity.this.findViewById(R.id.et_reg_age);
  37. args[2] = et_reg_age.getText().toString();
  38. //性别
  39. RadioButton rb_boy = RegisterActivity.this.findViewById(R.id.rb_boy);
  40. RadioButton rb_girl = RegisterActivity.this.findViewById(R.id.rb_girl);
  41. Boolean noCheckSex = true;
  42. if (rb_boy.isChecked() || rb_girl.isChecked()) {
  43. noCheckSex = false;
  44. if (rb_boy.isChecked()) {
  45. args[3] = "男";
  46. } else {
  47. args[3] = "女";
  48. }
  49. }
  50. //电话
  51. EditText et_reg_tel = RegisterActivity.this.findViewById(R.id.et_reg_tel);
  52. args[4] = et_reg_tel.getText().toString();
  53. //地址
  54. EditText et_reg_address = RegisterActivity.this.findViewById(R.id.et_reg_address);
  55. args[5] = et_reg_address.getText().toString();
  56. if(args[0].isEmpty()||args[1].isEmpty()||args[2].isEmpty()||noCheckSex||
  57. args[3].isEmpty()||args[4].isEmpty()||args[5].isEmpty()){
  58. Log.e("MSG","信息填写不完整!");
  59. }
  60. else{
  61. String qclient = "select * from client where admin=?";
  62. cursor = sqLiteDB.rawQuery(qclient,new String[]{args[0]});
  63. if(cursor.getCount()!=0){
  64. Log.e("MSG", "用户名已存在!");
  65. et_reg_admin.setText("");
  66. }
  67. else{
  68. if(!args[1].equals(checkpass)){
  69. Log.e("MSG","密码不一致!");
  70. et_reg_checkpass.setText("");
  71. }
  72. else{
  73. //把注册信息插入到client表中
  74. String iclient = "insert into client values(null,?,?,?,?,?,?)";
  75. sqLiteDB.execSQL(iclient,args);
  76. //封装数据,将注册的用户名和密码传给登录界面
  77. User user = new User(args[0], args[1]);
  78. Bundle bundle = new Bundle();
  79. bundle.putSerializable("user", user);
  80. Intent intent = getIntent();
  81. intent.putExtra("user", user);
  82. setResult(Activity.RESULT_OK, intent);
  83. finish();
  84. }
  85. }
  86. }
  87. }
  88. });
  89. //取消按钮
  90. this.findViewById(R.id.bt_cancel).setOnClickListener(new View.OnClickListener() {
  91. @Override
  92. public void onClick(View view) {
  93. setResult(Activity.RESULT_CANCELED);
  94. finish();
  95. }
  96. });
  97. }
  98. }

之后还当我们点击登录按钮就根据数据库中的信息判断是否存在,存在就跳转主活动界面 

  1. package com.example.androidapp;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.database.Cursor;
  5. import android.database.sqlite.SQLiteDatabase;
  6. import android.os.Bundle;
  7. import android.util.Log;
  8. import android.view.View;
  9. import android.widget.EditText;
  10. import androidx.activity.result.ActivityResult;
  11. import androidx.activity.result.ActivityResultCallback;
  12. import androidx.activity.result.ActivityResultLauncher;
  13. import androidx.activity.result.contract.ActivityResultContracts;
  14. import androidx.appcompat.app.AppCompatActivity;
  15. import com.example.androidapp.entity.User;
  16. import com.example.androidapp.database.ApplicationSqLite;
  17. public class LoginActivity extends AppCompatActivity {
  18. private SQLiteDatabase sqLiteDB;//数据库对象(包含操作数据库的方法)
  19. private Cursor cursor;//结果集对象(用作接收查询结果)
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_login);
  24. //获取数据库对象
  25. sqLiteDB = ApplicationSqLite.getDB();
  26. //登录按钮
  27. this.findViewById(R.id.bt_login).setOnClickListener(new View.OnClickListener() {
  28. @Override
  29. public void onClick(View v) {
  30. //获取输入的用户名、密码
  31. EditText et_admin = LoginActivity.this.findViewById(R.id.et_log_admin);
  32. EditText et_password = LoginActivity.this.findViewById(R.id.et_log_pass);
  33. //转换为字符串
  34. String admin = et_admin.getText().toString();
  35. String password = et_password.getText().toString();
  36. if(admin.isEmpty()||password.isEmpty()){
  37. Log.e("MSG","用户名或密码为空!");
  38. }
  39. else{
  40. String qclient = "select * from client where admin=? and pass=?";
  41. cursor = sqLiteDB.rawQuery(qclient,new String[]{admin,password});
  42. //若用户名和密码在数据库中存在,
  43. if(cursor.getCount()!=0){
  44. //则跳转到主活动界面
  45. Intent intent = new Intent(LoginActivity.this,MainActivity.class);
  46. startActivity(intent);
  47. //结束活动
  48. finish();
  49. }
  50. else{
  51. Log.e("MSG","用户名或密码错误!");
  52. }
  53. }
  54. }
  55. });
  56. //数据传输
  57. ActivityResultLauncher<Intent> launcher = this.registerForActivityResult(
  58. new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
  59. @Override
  60. public void onActivityResult(ActivityResult result) {
  61. //若返回数据为有效数据,
  62. if (result.getResultCode() == Activity.RESULT_OK) {
  63. //则获取数据
  64. Intent intent = result.getData();
  65. //取出Intent中所携带的数据包,即bundle
  66. Bundle bundle = intent.getBundleExtra("user");
  67. //bundle使用key-value来存储数据
  68. User user = (User)bundle.getSerializable("user");
  69. //设置数据,即设置登陆界面输入框里的用户名和密码
  70. EditText et_admin = LoginActivity.this.findViewById(R.id.et_log_admin);
  71. EditText et_password = LoginActivity.this.findViewById(R.id.et_log_pass);
  72. et_admin.setText(user.getLogin());
  73. et_password.setText(user.getPass());
  74. }
  75. }
  76. });
  77. //注册按钮
  78. this.findViewById(R.id.bt_register).setOnClickListener(new View.OnClickListener() {
  79. @Override
  80. public void onClick(View v) {
  81. //携带数据,Activity之间数据交换使用Intent来完成
  82. Intent intent = new Intent(LoginActivity.this,RegisterActivity.class);
  83. launcher.launch(intent);
  84. }
  85. });
  86. }
  87. }

 

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

闽ICP备14008679号