相关视频教程在某站上面(🔍浩宇软件开发)
1. 涉及到的技术点
- SQLite数据库的使用
- SharedPreferences首选项的使用
- LinearLayoutCompat线性布局的使用
- ImageView,TextView,EditText,Button,CheckBox基础控件的使用
2. 创建用户数据库
实现步骤:
- 编写一个类继承SQLiteOpenHelper,在onCreate里面实现建表操作。然后编写登录,注册方法
- 新建UserInfo对象实体
public class UserDbHelper extends SQLiteOpenHelper {
private static UserDbHelper sHelper;
private static final String DB_NAME = "user.db";
private static final int VERSION = 1;
public UserDbHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
//创建单例,供使用调用该类里面的的增删改查的方法
public synchronized static UserDbHelper getInstance(Context context) {
if (null == sHelper) {
sHelper = new UserDbHelper(context, DB_NAME, null, VERSION);
}
return sHelper;
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建user_table表
db.execSQL("create table user_table(user_id integer primary key autoincrement, " +
"username text," + //用户名
"password text," + //密码
"nickname text" + //
")");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
/**
* 登录
*/
@SuppressLint("Range")
public UserInfo login(String username) {
SQLiteDatabase db = getReadableDatabase();
UserInfo userInfo = null;
String sql = "select user_id,username,password,nickname from user_table where username=?";
String[] selectionArgs = {username};
Cursor cursor = db.rawQuery(sql, selectionArgs);
if (cursor.moveToNext()) {
int user_id = cursor.getInt(cursor.getColumnIndex("user_id"));
String name = cursor.getString(cursor.getColumnIndex("username"));
String password = cursor.getString(cursor.getColumnIndex("password"));
String nickname = cursor.getString(cursor.getColumnIndex("nickname"));
userInfo = new UserInfo(user_id, name, password, nickname);
}
cursor.close();
db.close();
return userInfo;
}
/**
* 注册
*/
public int register(String username, String password, String nickname) {
//获取SQLiteDatabase实例
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
//填充占位符
values.put("username", username);
values.put("password", password);
values.put("nickname", nickname);
String nullColumnHack = "values(null,?,?,?)";
//执行
int insert = (int) db.insert("user_table", nullColumnHack, values);
db.close();
return insert;
}
/**
* 修改密码
*/
public int updatePwd(String username, String password) {
//获取SQLiteDatabase实例
SQLiteDatabase db = getWritableDatabase();
// 填充占位符
ContentValues values = new ContentValues();
values.put("password", password);
// 执行SQL
int update = db.update("user_table", values, " username=?", new String[]{username});
// 关闭数据库连接
db.close();
return update;
}
}
UserInfo实体
public class UserInfo {
private int user_id;
private String username;
private String password;
private String nickname;
public static UserInfo sUserInfo;
public static UserInfo getUserInfo() {
return sUserInfo;
}
public static void setUserInfo(UserInfo userInfo) {
sUserInfo = userInfo;
}
public UserInfo(int user_id, String username, String password, String nickname) {
this.user_id = user_id;
this.username = username;
this.password = password;
this.nickname = nickname;
}
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
}
3. 代码实现过程
- 注册activity_register.xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat 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:orientation="vertical"
tools:context=".LoginActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/my_light_primary"
app:navigationIcon="@drawable/baseline_arrow_back_24"
app:title="注册"
app:titleTextColor="@color/white" />
<ImageView
android:layout_width="match_parent"
android:layout_height="200dp"
android:scaleType="centerCrop"
android:src="@mipmap/img_login_logo" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:gravity="center"
android:text="注册"
android:textColor="#333"
android:textSize="20sp"
android:textStyle="bold" />
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="26dp"
android:orientation="vertical">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@drawable/login_et_bg"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/baseline_account_box_24" />
<EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:background="@null"
android:hint="请输入用户名"
android:textSize="14sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="10dp"
android:background="@drawable/login_et_bg"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/baseline_https_24" />
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:background="@null"
android:hint="请输入密码"
android:inputType="textPassword"
android:textSize="14sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<Button
android:id="@+id/register"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="20dp"
android:text="注册" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
注册布局效果图如下
- 注册RegisterActivity.java页面
public class RegisterActivity extends AppCompatActivity {
private EditText et_username;
private EditText et_password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
//初始化控件
et_username = findViewById(R.id.et_username);
et_password = findViewById(R.id.et_password);
//返回
findViewById(R.id.toolbar).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//不要跳转到登录页面,直接把当前页面销毁掉就可以了
finish();
}
});
//点击注册
findViewById(R.id.register).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String username = et_username.getText().toString();
String password = et_password.getText().toString();
if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){
Toast.makeText(RegisterActivity.this, "请输入用户名和密码", Toast.LENGTH_SHORT).show();
}else {
int row = UserDbHelper.getInstance(RegisterActivity.this).register(username, password, "暂无~~~");
if (row>0){
Toast.makeText(RegisterActivity.this, "注册成功,请登录", Toast.LENGTH_SHORT).show();
finish();
}
}
}
});
}
}
- 登录activity_login.xml布局
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat 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:orientation="vertical"
tools:context=".LoginActivity">
<View
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/my_light_primary" />
<ImageView
android:layout_width="match_parent"
android:layout_height="200dp"
android:scaleType="centerCrop"
android:src="@mipmap/img_login_logo" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:gravity="center"
android:text="登录"
android:textColor="#333"
android:textSize="20sp"
android:textStyle="bold" />
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="26dp"
android:orientation="vertical">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@drawable/login_et_bg"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/baseline_account_box_24" />
<EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:background="@null"
android:hint="请输入用户名"
android:textSize="14sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="10dp"
android:background="@drawable/login_et_bg"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/baseline_https_24" />
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:background="@null"
android:hint="请输入密码"
android:inputType="textPassword"
android:textSize="14sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="记住密码" />
<TextView
android:id="@+id/register"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_gravity="right"
android:layout_marginTop="10dp"
android:text="还未注册?"
android:textColor="@color/my_light_primary" />
</RelativeLayout>
<Button
android:id="@+id/login"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="20dp"
android:text="登录" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
登录布局效果图如下
- 登录LoginActivity.java页面
public class LoginActivity extends AppCompatActivity {
private EditText et_username;
private EditText et_password;
private CheckBox checkbox;
private boolean is_login;
private SharedPreferences mSharedPreferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//初始化控件
et_username = findViewById(R.id.et_username);
et_password = findViewById(R.id.et_password);
checkbox = findViewById(R.id.checkbox);
//获取mSharedPreferences实例
mSharedPreferences = getSharedPreferences("user", MODE_PRIVATE);
//是否勾选了记住密码
is_login = mSharedPreferences.getBoolean("is_login", false);
if (is_login) {
String username = mSharedPreferences.getString("username", null);
String password = mSharedPreferences.getString("password", null);
et_username.setText(username);
et_password.setText(password);
checkbox.setChecked(true);
}
//点击注册
findViewById(R.id.register).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//跳转到注册页面
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
}
});
//登录
findViewById(R.id.login).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String username = et_username.getText().toString();
String password = et_password.getText().toString();
if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
Toast.makeText(LoginActivity.this, "请输入用户名和密码", Toast.LENGTH_SHORT).show();
} else {
UserInfo login = UserDbHelper.getInstance(LoginActivity.this).login(username);
if (login != null) {
if (username.equals(login.getUsername()) && password.equals(login.getPassword())) {
SharedPreferences.Editor edit = mSharedPreferences.edit();
edit.putBoolean("is_login", is_login);
edit.putString("username", username);
edit.putString("password", password);
//这句话不能少
edit.commit();
//保存用户名和密码
UserInfo.setUserInfo(login);
//登录成功
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
finish();
} else {
Toast.makeText(LoginActivity.this, "用户名或密码错误", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(LoginActivity.this, "该账号暂未注册", Toast.LENGTH_SHORT).show();
}
}
}
});
//checkbox的点击事件
checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
is_login = isChecked;
}
});
}
}