基于SQLite的Android登录APP
该登录APP主要包括三个模块:
- 登录:用户选择登录方式、登录身份,输入账号密码,完成登录。
- 忘记密码:用户输入新密码及验证码修改登录密码。
- 个人信息:用户完成登录后设置个人信息并显示。
使用控件:
- 单选按钮RadioButton:区分是密码登录还是验证码登录。
- 下拉框Spinner:区分是个人用户还是公司用户。
- 编辑框EditText:输入手机号和密码(或验证码)。
- 复选框CheckBox:判断是否记住密码。
- 相对布局RelativeLayout:界面的整体布局,方便将各个控件按照相对位置摆放。
- 框架布局FrameLayout:在框架布局中后面添加的子视图会把之前的子视图覆盖掉,一般用于需要重叠显示的场合。用于实现忘记密码按钮和密码输入框的叠加。
采用的存储方式
- 共享参数SharedPreferences:
是Android的一个轻量级存储工具,采用的存储结构是Key-Value的键值对方式,类似于Java的Properties类,都是把Key-Value的键值对保存在配置文件中,不同的是Properties的文件内容是Key=Value的形式,而SharedPreferences的存储介质是符合XML规范的配置文件。本案例中用于保存用户的账号和密码。 - 数据库SQLite:
是一个小巧的嵌入式数据库。本案例中用于存储用户的个人信息。
成果展示:
界面设计:
1. 登录界面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
android:paddingTop="10dp"
android:padding="8dp">
<RadioGroup
android:id="@+id/rg_login_way"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="20dp">
<RadioButton
android:id="@+id/rb_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密码登录"
android:textSize="25sp" />
<RadioButton
android:id="@+id/rb_checkcode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="验证码登录"
android:layout_marginLeft="50dp"
android:textSize="25sp" />
</RadioGroup>
<TextView
android:id="@+id/tv_shenfen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是:"
android:layout_below="@+id/rg_login_way"
android:textSize="25sp"
android:layout_marginTop="40dp"
android:textColor="@color/black"
android:layout_marginLeft="30dp"
android:layout_alignRight="@+id/tv_phonenum"/>
<Spinner
android:id="@+id/sp_shenfen"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/tv_shenfen"
android:layout_alignBottom="@+id/tv_shenfen"
android:spinnerMode="dialog"/>
<TextView
android:id="@+id/tv_phonenum"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_shenfen"
android:text="手机号码:"
android:textSize="25sp"
android:textColor="@color/black"
android:layout_marginTop="40dp"/>
<EditText
android:id="@+id/et_phone"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignBaseline="@id/tv_phonenum"
android:layout_toRightOf="@+id/tv_phonenum"
android:background="@drawable/eb_selector"
android:textSize="25sp"
android:hint="请输入手机号码"
android:inputType="number" />
<TextView
android:id="@+id/tv_psw"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:text="登录密码:"
android:layout_below="@id/tv_phonenum"
android:textSize="25sp"
android:layout_marginTop="40dp"
android:textColor="@color/black"/>
<FrameLayout
android:id="@+id/fm_psw"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_toRightOf="@id/tv_psw"
android:layout_alignBottom="@+id/tv_psw"
android:layout_alignLeft="@+id/et_phone">
<EditText
android:id="@+id/et_psw"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="请输入密码"
android:textSize="25sp"
android:background="@drawable/eb_selector" />
<Button
android:id="@+id/btn_pswforget"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="忘记密码"
android:textSize="25sp"
android:background="@color/darkgray"
android:padding="10dp"
android:layout_gravity="end"/>
</FrameLayout>
<CheckBox
android:id="@+id/cb_pswrmb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_psw"
android:text="记住密码"
android:textSize="25sp"
android:layout_marginTop="30dp"/>
<Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_below="@id/cb_pswrmb"
android:text="登录"
android:textSize="25sp"
android:layout_marginTop="30dp"
android:background="@color/darkgray"/>
</RelativeLayout>
- 忘记密码界面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
android:padding="8dp"
android:paddingTop="10dp"
tools:context=".PswForgetActivity">
<TextView
android:id="@+id/tv_newpsw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="输入新密码:"
android:textColor="@color/black"
android:textSize="25sp"
android:layout_marginTop="20dp"/>
<EditText
android:id="@+id/et_newpsw"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/tv_newpsw"
android:background="@drawable/eb_selector"
android:layout_alignBaseline="@+id/tv_newpsw"
android:hint="请输入新密码"
android:textSize="25sp"
android:inputType="textPassword"
/>
<TextView
android:id="@+id/tv_chknewpsw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:text="确认新密码:"
android:layout_below="@+id/tv_newpsw"
android:textSize="25sp"
android:textColor="@color/black"/>
<EditText
android:id="@+id/et_chknewpsw"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/tv_chknewpsw"
android:layout_alignBaseline="@+id/tv_chknewpsw"
android:background="@drawable/eb_selector"
android:textSize="25sp"
android:hint="请再次输入新密码"
android:inputType="textPassword"/>
<TextView
android:id="@+id/tv_checkcode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="验证码:"
android:layout_below="@+id/tv_chknewpsw"
android:textSize="25sp"
android:textColor="@color/black"
android:layout_marginTop="40dp"/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/tv_checkcode"
android:layout_below="@+id/et_chknewpsw"
android:layout_marginTop="20dp">
<EditText
android:id="@+id/et_checkcode"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="25sp"
android:hint="输入验证码"
android:inputType="number"
android:background="@drawable/eb_selector"
android:maxLines="1"/>
<Button
android:id="@+id/btn_sendcheckcode"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="right"
android:text="获取验证码"
android:textSize="25sp"
android:padding="10dp"
android:textColor="@color/black"
android:background="@color/darkgray"/>
</FrameLayout>
<Button
android:id="@+id/btn_check"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_below="@id/tv_checkcode"
android:text="确定"
android:textSize="25sp"
android:layout_marginTop="30dp"
android:background="@color/darkgray" />
</RelativeLayout>
- 个人信息填写界面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".SharedPreferencesActivity"
android:padding="10dp">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名:"
android:textSize="25sp"
android:textColor="@color/black"
android:layout_marginTop="20dp"/>
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/tv_name"
android:layout_alignBaseline="@+id/tv_name"
android:background="@drawable/eb_selector"
android:maxLines="1"/>
<TextView
android:id="@+id/tv_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="年龄:"
android:textSize="25sp"
android:textColor="@color/black"
android:layout_below="@+id/tv_name"
android:layout_marginTop="20dp"/>
<EditText
android:id="@+id/et_age"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/tv_age"
android:layout_alignBaseline="@+id/tv_age"
android:background="@drawable/eb_selector"
android:maxLines="1"
android:inputType="number"/>
<TextView
android:id="@+id/tv_height"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="身高:"
android:textSize="25sp"
android:textColor="@color/black"
android:layout_below="@+id/tv_age"
android:layout_marginTop="20dp"/>
<EditText
android:id="@+id/et_height"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/tv_height"
android:layout_alignBaseline="@+id/tv_height"
android:background="@drawable/eb_selector"
android:maxLines="1"
android:inputType="number"/>
<TextView
android:id="@+id/tv_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="体重:"
android:textSize="25sp"
android:textColor="@color/black"
android:layout_below="@+id/tv_height"
android:layout_marginTop="20dp"/>
<EditText
android:id="@+id/et_weight"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/tv_weight"
android:layout_alignBaseline="@+id/tv_weight"
android:background="@drawable/eb_selector"
android:maxLines="1"
android:inputType="number"/>
<TextView
android:id="@+id/tv_married"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="婚否:"
android:layout_below="@+id/tv_weight"
android:textSize="25sp"
android:textColor="@color/black"
android:layout_marginTop="20dp"/>
<Spinner
android:id="@+id/sp_married"
android:layout_width="match_parent"
android:layout_height="40dp"
android:spinnerMode="dropdown"
android:layout_toRightOf="@+id/tv_married"
android:layout_alignBottom="@+id/tv_married"/>
<Button
android:id="@+id/btn_save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_married"
android:layout_marginTop="20dp"
android:background="@drawable/selector"
android:text="保存"
android:textSize="25sp"
android:textColor="@color/black"/>
</RelativeLayout>
- 个人信息显示界面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".SharedPreferencesActivity2">
<TextView
android:id="@+id/tv_show"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_delete"
android:textSize="25sp"/>
<Button
android:id="@+id/btn_delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除"
android:textSize="25sp"/>
</RelativeLayout>
代码实现
UserDBHelper
package com.example.helloworld;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import androidx.annotation.Nullable;
import androidx.core.app.NavUtils;
import java.util.ArrayList;
import java.util.Locale;
public class UserDBHelper extends SQLiteOpenHelper {
private static final String TAG = "UserDBHelper";
private static final String DB_NAME = "user.db"; //数据库名
private static final int DB_VERSION = 1; //数据库版本
private static UserDBHelper mHelper = null;
private SQLiteDatabase mDB = null;
private static final String TABLE_NAME = "user_info"; //表名
private UserDBHelper(Context context){
super(context,DB_NAME,null,DB_VERSION);
}
private UserDBHelper(Context context,int version){
super(context,DB_NAME,null,version);
}
public static UserDBHelper getInstance(Context context,int version){
if(version > 0 && mHelper == null){
mHelper = new UserDBHelper(context,version);
}else if(mHelper == null){
mHelper = new UserDBHelper(context);
}
return mHelper;
}
public SQLiteDatabase openReadLink(){
if (mDB == null || !mDB.isOpen()){
mDB = mHelper.getReadableDatabase();
}
return mDB;
}
public SQLiteDatabase openWriteLink(){
if (mDB == null || !mDB.isOpen()){
mDB = mHelper.getWritableDatabase();
Log.d(TAG, "openWriteLink: 打开了读数据库");
}
return mDB;
}
public void closeLink(){
if (mDB != null && mDB.isOpen()){
mDB.close();
mDB = null;
}
}
public String getDBName(){
if(mHelper != null){
return mHelper.getDatabaseName();
}else {
return DB_NAME;
}
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.d(TAG, "onCreate: 创建数据库");
String drop_sql = "DROP TABLE IF EXISTS " + TABLE_NAME + ";";
db.execSQL(drop_sql);
String create_sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " ("
+ "_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
+ "name VARCHAR NOT NULL,"
+ "age INTEGER NOT NULL,"
+ "height LONG NOT NULL,"
+ "weight FLOAT NOT NULL,"
+ "married INTEGER NOT NULL,"
+ "update_time VARCHAR NOT NULL,"
+ "phone VARCHAR NOT NULL,"
+ "password VARCHAR NOT NULL"
+ ");";
Log.d(TAG, "create_sql" + create_sql);
db.execSQL(create_sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d(TAG, "onUpgrade oldVersion=" +oldVersion+",newVersion=" + newVersion+"数据库新旧版本号");
if (newVersion > 1){
String alter_sql = "ALTER TABLE" + TABLE_NAME + "ADD COLUMN" + "phone VARCHAR;";
Log.d(TAG, "alter_sql:" + alter_sql);
db.execSQL(alter_sql);
alter_sql = "ALTER TABLE" + TABLE_NAME + "ADD COLUMN" + "password VARCHAR;";
Log.d(TAG, "alter_sql:" + alter_sql);
db.execSQL(alter_sql);
}
}
public int delete(String condition){
int count = mDB.delete(TABLE_NAME,condition,null);
return count;
}
public int deleteAll(){
int count = mDB.delete(TABLE_NAME,"1=1",null);
return count;
}
public long insert(UserInfo info){
ArrayList<UserInfo> infoArray = new ArrayList<UserInfo>();
infoArray.add(info);
return insert(infoArray);
}
public ArrayList<UserInfo>query(String condition) {
String sql = String.format(Locale.CHINA,"select rowid,_id,name,age,height,weight,married,update_time," + "phone,password from %s where %s;", TABLE_NAME,condition);
Log.d(TAG, "query sql: " + sql);
ArrayList<UserInfo> infoArray = new ArrayList<UserInfo>();
Cursor cursor = mDB.rawQuery(sql, null);
while (cursor.moveToNext()) {
UserInfo info = new UserInfo();
info.rowid = cursor.getLong(0);
info.xuhao = cursor.getInt(1);
info.name = cursor.getString(2);
info.age = cursor.getInt(3);
info.height = cursor.getLong(4);
info.weight = cursor.getFloat(5);
info.married = (cursor.getInt(6) == 0) ? false : true;
info.update_time = cursor.getString(7);
info.phone = cursor.getString(8);
info.password = cursor.getString(9);
infoArray.add(info);
}
cursor.close();
return infoArray;
}
public long insert(ArrayList<UserInfo> infoArray) {
long result = -1;
for (int i = 0; i < infoArray.size(); i++) {
UserInfo info = infoArray.get(i);
ArrayList<UserInfo> tempArray = new ArrayList<UserInfo>();
if (info.name != null && info.name.length() > 0) {
String condition = String.format("name='%s'", info.name);
tempArray = query(condition);
if (tempArray.size() > 0) {
update(info, condition);
result = tempArray.get(0).rowid;
continue;
}
}
if (info.phone != null && info.phone.length() > 0) {
String condition = String.format("phone='%s'", info.phone);
tempArray = query(condition);
if (tempArray.size() > 0) {
update(info, condition);
result = tempArray.get(0).rowid;
continue;
}
}
Log.d(TAG, "insert: 当前版本号"+mDB.getVersion());
ContentValues cv = new ContentValues();
cv.put("name", info.name);
cv.put("age", info.age);
cv.put("height", info.height);
cv.put("weight", info.weight);
cv.put("married", info.married);
cv.put("update_time", info.update_time);
cv.put("phone", info.phone);
cv.put("password", info.password);
result = mDB.insert(TABLE_NAME, "", cv);
if (result == -1) {
return result;
}
}
return result;
}
public int update(UserInfo info, String condition) {
ContentValues cv = new ContentValues();
cv.put("name", info.name);
cv.put("age", info.age);
cv.put("height", info.height);
cv.put("weight", info.weight);
cv.put("married", info.married);
cv.put("update_time", info.update_time);
cv.put("phone", info.phone);
cv.put("password", info.password);
// 执行更新记录动作,该语句返回记录更新的数目
return mDB.update(TABLE_NAME, cv, condition, null);
}
public int update(UserInfo info) {
return update(info, "rowid=" + info.rowid);
}
public UserInfo queryByPhone(String phone){
UserInfo info = null;
ArrayList<UserInfo> infoArray = query(String.format("phone=%s",phone));
if (infoArray.size() > 0 ){
info = infoArray.get(0);
}
return info;
}
}
UserInfo
package com.example.helloworld;
public class UserInfo {
public long rowid;
public int xuhao;
public String name;
public int age;
public long height;
public float weight;
public boolean married;
public String update_time;
public String phone;
public String password;
public UserInfo() {
rowid = 0l;
xuhao = 0;
name = "";
age = 0;
height = 0l;
weight = 0.0f;
married = false;
update_time = "";
phone = "";
password = "";
}
}
LoginActivity
package com.example.helloworld;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Rect;
import android.os.Bundle;
import android.text.InputType;
import android.text.method.PasswordTransformationMethod;
import android.text.method.TransformationMethod;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.Toast;
import java.net.PasswordAuthentication;
public class LoginActivity extends AppCompatActivity implements View.OnClickListener {
private EditText et_phone;
private RadioButton rb_psw;
private RadioButton rb_checkcode;
private EditText et_psw;
private Button btn_pswforget;
private String mPassword;
private int mRequestcode;
private String mCheckCode;
private int mType;
private String TAG = "huahua";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
rb_psw = findViewById(R.id.rb_password);
rb_checkcode = findViewById(R.id.rb_checkcode);
et_phone = findViewById(R.id.et_phone);
et_psw = findViewById(R.id.et_psw);
CheckBox cb_pswforget = findViewById(R.id.cb_pswrmb);
Button btn_login = findViewById(R.id.btn_login);
btn_pswforget = findViewById(R.id.btn_pswforget);
btn_login.setOnClickListener(this);
btn_pswforget.setOnClickListener(this);
RadioGroup rg = findViewById(R.id.rg_login_way);
mPassword = et_psw.getText().toString();
rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
RadioButton rb = findViewById(checkedId);
Log.i(TAG, "onCheckedChanged: 密码登录"+ rb_psw.isChecked());
Log.i(TAG, "onCheckedChanged: 验证码登录"+rb_checkcode.isChecked());
if(rb_psw.isChecked()){
et_psw.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD | InputType.TYPE_CLASS_TEXT);
}
}
});
cb_pswforget.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
}
});
ArrayAdapter<String> typeAdapter = new ArrayAdapter<String>(this,R.layout.item_dropdown,typeArray);
typeAdapter.setDropDownViewResource(R.layout.item_dropdown);
Spinner sp_type = findViewById(R.id.sp_shenfen);
sp_type.setAdapter(typeAdapter);
sp_type.setSelection(0);
sp_type.setPrompt("选择你的登录身份:");
sp_type.setOnItemSelectedListener(new MyOnItemSeclectedListener());
}
private String[] typeArray = {"个人用户","企业用户"};
private class MyOnItemSeclectedListener implements AdapterView.OnItemSelectedListener{
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
mType = position;
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == mRequestcode && data != null) {
mPassword = data.getStringExtra("newpsw");
}
}
@Override
protected void onRestart() {
et_psw.setText("");
super.onRestart();
}
@Override
public void onClick(View v) {
String phone = et_phone.getText().toString();
switch (v.getId()){
case R.id.btn_pswforget: {
Log.i(TAG, "onClick: 点击了忘记密码");
if (phone == null || phone.length() < 11) {
Toast.makeText(this, "请输入正确的手机号", Toast.LENGTH_SHORT).show();
return;
}
if (rb_psw.isChecked()) {
Log.i(TAG, "onClick: 进入忘记密码界面");
Intent intent = new Intent(this, PswForgetActivity.class);
intent.putExtra("phone", phone);
startActivityForResult(intent, mRequestcode);
} else if (rb_checkcode.isChecked()) {
mCheckCode = String.format("%06d", (int) (Math.random() * 1000000 % 1000000));
Log.i(TAG, "onClick: 发送验证码");
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("请记住验证码!");
builder.setMessage("手机号" + phone + ",本次验证码是:" + mCheckCode + ",请输入验证码");
builder.setPositiveButton("确定", null);
AlertDialog alert = builder.create();
alert.show();
}
}
break;
case R.id.btn_login: {
if (phone == null || phone.length() < 11) {
Toast.makeText(this, "请输入正确的手机号!", Toast.LENGTH_SHORT).show();
Log.i(TAG, "onClick: 验证密码");
return;
}
if (rb_psw.isChecked()) {
if (!et_psw.getText().toString().equals(mPassword) || et_psw.getText().toString().equals("")) {
Toast.makeText(this, "请输入正确的密码", Toast.LENGTH_SHORT).show();
return;
} else {
loginSuccess();
}
} else if (rb_checkcode.isChecked()) {
if (!et_psw.getText().toString().equals(mCheckCode)) {
Toast.makeText(this, "请输入正确的验证码", Toast.LENGTH_SHORT).show();
return;
} else {
loginSuccess();
}
}
}
}
}
private void loginSuccess(){
String desc = String.format("您的手机号码是%s,类型是%s。恭喜你通过登录验证,点击“确定”按钮返回上个页面",et_phone.getText().toString(),typeArray[mType]);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("登录成功");
builder.setMessage(desc);
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(LoginActivity.this,SharedPreferencesActivity.class);
startActivity(intent);
SharedPreferences sps = getSharedPreferences("Login", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sps.edit();
editor.putString("phone",et_phone.getText().toString());
editor.putString("password",et_psw.getText().toString());
editor.apply();
}
});
builder.setNegativeButton("取消",null);
AlertDialog alert = builder.create();
alert.show();
}
}
PswForgetActivity
package com.example.helloworld;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.InputType;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.Toast;
public class PswForgetActivity extends AppCompatActivity implements View.OnClickListener {
private EditText et_newpsw;
private EditText et_chknewpsw;
private EditText et_checkcode;
private String mCheckCode;
private String mPhone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_psw_forget);
et_newpsw = findViewById(R.id.et_newpsw);
et_chknewpsw = findViewById(R.id.et_chknewpsw);
et_checkcode = findViewById(R.id.et_checkcode);
findViewById(R.id.btn_sendcheckcode).setOnClickListener(this);
findViewById(R.id.btn_check).setOnClickListener(this);
mPhone = getIntent().getStringExtra("phone");
et_newpsw.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD | InputType.TYPE_CLASS_TEXT);
et_chknewpsw.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD | InputType.TYPE_CLASS_TEXT);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_sendcheckcode:
if(mPhone == null || mPhone.length() < 11){
Toast.makeText(this,"请输入正确的手机号",Toast.LENGTH_SHORT).show();
return;
}
mCheckCode = String.format("%06d",(int)(Math.random()*1000000%1000000));
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("请记住验证码");
builder.setMessage("手机号"+mPhone+",本次验证码是"+mCheckCode+",请输入验证码");
builder.setPositiveButton("确定",null);
AlertDialog alertDialog = builder.create();
alertDialog.show();
case R.id.btn_check:
String newpsw = et_newpsw.getText().toString();
String chknewpsw = et_chknewpsw.getText().toString();
if(newpsw == null || newpsw.length() < 6 || chknewpsw == null || chknewpsw.length() < 6){
Toast.makeText(this,"请输入正确的新密码",Toast.LENGTH_SHORT).show();
return;
}else if(!newpsw.equals(chknewpsw)){
Toast.makeText(this,"两次输入的新密码不一致",Toast.LENGTH_SHORT).show();
return;
}else if(!et_checkcode.getText().toString().equals(mCheckCode)){
Toast.makeText(this,"请输入正确的验证码",Toast.LENGTH_SHORT).show();
return;
}else {
Toast.makeText(this,"密码修改成功",Toast.LENGTH_SHORT).show();
Intent intent = new Intent();
intent.putExtra("newpsw",newpsw);
setResult(Activity.RESULT_OK,intent);
finish();
}
}
}
}
InfoWriteActivity
package com.example.helloworld;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
public class InfoWriteActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "huahua";
private UserDBHelper mHelper;
private EditText et_name;
private EditText et_age;
private EditText et_height;
private EditText et_weight;
private boolean Married = false;
private String phone;
private String password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shared_preferences);
et_name = findViewById(R.id.et_name);
et_age = findViewById(R.id.et_age);
et_height = findViewById(R.id.et_height);
et_weight = findViewById(R.id.et_weight);
findViewById(R.id.btn_save).setOnClickListener(this);
SharedPreferences sps = getSharedPreferences("Login",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sps.edit();
phone = sps.getString("phone","");
password = sps.getString("password","");
ArrayAdapter<String> typeAdapter = new ArrayAdapter<String>(this, R.layout.item_dropdown, typeArray);
typeAdapter.setDropDownViewResource(R.layout.item_dropdown);
Spinner sp_married = findViewById(R.id.sp_married);
sp_married.setAdapter(typeAdapter);
sp_married.setPrompt("请选择婚姻状况");
sp_married.setSelection(0);
sp_married.setOnItemSelectedListener(new TypeSelectedListener());
}
private String[] typeArray = {"未婚", "已婚"};
class TypeSelectedListener implements AdapterView.OnItemSelectedListener {
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Married = (arg2 == 0) ? false : true;
}
public void onNothingSelected(AdapterView<?> arg0) {
}
}
@Override
protected void onStart() {
super.onStart();
SQLiteDatabase mDB = getApplicationContext().openOrCreateDatabase("user.db", Context.MODE_PRIVATE, null);
mHelper = UserDBHelper.getInstance(this, 1);
mHelper.openWriteLink();
}
@Override
protected void onStop() {
super.onStop();
mHelper.closeLink();
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_save) {
String name = et_name.getText().toString();
String age = et_age.getText().toString();
String height = et_height.getText().toString();
String weight = et_weight.getText().toString();
if (name == null || name.length() <= 0) {
showToast("请先填写姓名");
return;
}
if (age == null || age.length() <= 0) {
showToast("请先填写年龄");
return;
}
if (height == null || height.length() <= 0) {
showToast("请先填写身高");
return;
}
if (weight == null || weight.length() <= 0) {
showToast("请先填写体重");
return;
}
UserInfo info = new UserInfo();
info.name = name;
info.age = Integer.parseInt(age);
info.height = Long.parseLong(height);
info.weight = Float.parseFloat(weight);
info.married = Married;
info.phone = phone;
info.password = password;
//info.update_time = DateUtil.getCurDateStr("yyyy-MM-dd HH:mm:ss");
info.update_time = DateUtil.getNowDate(DateUtil.DatePattern.ALL_TIME);
Log.d(TAG, "onClick: 手机号" + info.phone+info.password+info.name+info.update_time+info.married);
mHelper.insert(info);
Intent intent = new Intent(InfoWriteActivity.this, InfoReadActivity.class);
startActivity(intent);
showToast("数据已写入SQLite数据库");
}
}
private void showToast(String desc) {
Toast.makeText(this, desc, Toast.LENGTH_SHORT).show();
}
public static void startHome(Context mContext) {
Intent intent = new Intent(mContext, InfoWriteActivity.class);
mContext.startActivity(intent);
}
}
InfoReadActivity
package com.example.helloworld;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
public class InfoWriteActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "huahua";
private UserDBHelper mHelper;
private EditText et_name;
private EditText et_age;
private EditText et_height;
private EditText et_weight;
private boolean Married = false;
private String phone;
private String password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shared_preferences);
et_name = findViewById(R.id.et_name);
et_age = findViewById(R.id.et_age);
et_height = findViewById(R.id.et_height);
et_weight = findViewById(R.id.et_weight);
findViewById(R.id.btn_save).setOnClickListener(this);
SharedPreferences sps = getSharedPreferences("Login",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sps.edit();
phone = sps.getString("phone","");
password = sps.getString("password","");
ArrayAdapter<String> typeAdapter = new ArrayAdapter<String>(this, R.layout.item_dropdown, typeArray);
typeAdapter.setDropDownViewResource(R.layout.item_dropdown);
Spinner sp_married = findViewById(R.id.sp_married);
sp_married.setAdapter(typeAdapter);
sp_married.setPrompt("请选择婚姻状况");
sp_married.setSelection(0);
sp_married.setOnItemSelectedListener(new TypeSelectedListener());
}
private String[] typeArray = {"未婚", "已婚"};
class TypeSelectedListener implements AdapterView.OnItemSelectedListener {
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Married = (arg2 == 0) ? false : true;
}
public void onNothingSelected(AdapterView<?> arg0) {
}
}
@Override
protected void onStart() {
super.onStart();
SQLiteDatabase mDB = getApplicationContext().openOrCreateDatabase("user.db", Context.MODE_PRIVATE, null);
mHelper = UserDBHelper.getInstance(this, 1);
mHelper.openWriteLink();
}
@Override
protected void onStop() {
super.onStop();
mHelper.closeLink();
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_save) {
String name = et_name.getText().toString();
String age = et_age.getText().toString();
String height = et_height.getText().toString();
String weight = et_weight.getText().toString();
if (name == null || name.length() <= 0) {
showToast("请先填写姓名");
return;
}
if (age == null || age.length() <= 0) {
showToast("请先填写年龄");
return;
}
if (height == null || height.length() <= 0) {
showToast("请先填写身高");
return;
}
if (weight == null || weight.length() <= 0) {
showToast("请先填写体重");
return;
}
UserInfo info = new UserInfo();
info.name = name;
info.age = Integer.parseInt(age);
info.height = Long.parseLong(height);
info.weight = Float.parseFloat(weight);
info.married = Married;
info.phone = phone;
info.password = password;
info.update_time = DateUtil.getNowDate(DateUtil.DatePattern.ALL_TIME);
Log.d(TAG, "onClick: 手机号" + info.phone+info.password+info.name+info.update_time+info.married);
mHelper.insert(info);
Intent intent = new Intent(InfoWriteActivity.this, InfoReadActivity.class);
startActivity(intent);
showToast("数据已写入SQLite数据库");
}
}
private void showToast(String desc) {
Toast.makeText(this, desc, Toast.LENGTH_SHORT).show();
}
public static void startHome(Context mContext) {
Intent intent = new Intent(mContext, InfoWriteActivity.class);
mContext.startActivity(intent);
}
}