本篇使用SharedPreference,实现简单的注册登陆界面
同时这也是中国大学慕课移动终端应用开发的网课作业20
原题目要求:
(1)通过“注册”按钮,跳转到“注册”界面输入用户名和密码。
(2)点击“登录”按钮,匹配已“注册”的用户名和“密码”,用户名和密码正确与否,用Toast进行信息提示。
说明
1.有关SharedPreference的学习,建议大家阅读此篇博客:Android中SharedPreference的用法
2.由于需要存储复杂类型对象列表,我的解决方案是将List对象转换为json对象再进行的存储。使用的是fastjson。
3.能实现判断用户注册是否重复,允许输入正确口令的用户登陆等简单功能。
4.功能简单,仅作参考
代码
包含两个Activity及对应布局和一个User对象
1.添加依赖
由于使用的是阿里巴巴的fastjson,所以得先build.gradle文件中添加对fastjson的依赖
implementation 'com.alibaba:fastjson:1.2.10'
2.MainActivity.java
public class MainActivity extends AppCompatActivity {
private EditText mEditTextName,mEditTextPassword;
private Button mButtonRegister,mButtonLogin;
private ArrayList<User> mUsers = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
mButtonLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = mEditTextName.getText().toString();
String password = mEditTextPassword.getText().toString();
if (!name.equals("")&&!password.equals("")){
User user = new User(name,password);
mUsers = read();//获取已经注册的集合
if (!judge(user)){//如果不存在
Toast.makeText(MainActivity.this,"用户名或密码错误",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this,"登陆成功,欢迎您",Toast.LENGTH_LONG).show();
}
}else {
Toast.makeText(MainActivity.this,"用户名或密码为空",Toast.LENGTH_SHORT).show();
}
}
});
mButtonRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(RegisterActivity.createIntent(MainActivity.this));
}
});
}
private void init(){
mEditTextName = findViewById(R.id.login_edit_name);
mEditTextPassword = findViewById(R.id.login_edit_password);
mButtonLogin = findViewById(R.id.login_button_login);
mButtonRegister = findViewById(R.id.login_button_register);
}
/**
* 判断user的用户名密码是否匹配
* */
private boolean judge(User user){
boolean flag = false;
for (User u:mUsers){
//用户名与密码相互匹配
if (user.name.equals(u.name)&&user.password.equals(u.password)){
flag = true;
}
}
return flag;
}
/**
* 读取数据
* */
private ArrayList<User> read(){
//只允许本应用读取
SharedPreferences mSharedPreferences = getSharedPreferences("userLoginInfo",MODE_PRIVATE);
String json = mSharedPreferences.getString("data","");
ArrayList<User> users = new ArrayList<>();
if (!json.equals("")){
users = (ArrayList<User>) JSON.parseArray(json,User.class);
}
return users;
}
}
3.对应的主布局文件 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<TextView
android:layout_width="60dp"
android:layout_marginLeft="10dp"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="账号:"/>
<EditText
android:id="@+id/login_edit_name"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="5"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<TextView
android:layout_width="60dp"
android:layout_marginLeft="10dp"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="密码:" />
<EditText
android:id="@+id/login_edit_password"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="5"
android:inputType="textPassword"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="20dp">
<Button
android:id="@+id/login_button_register"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:text="注册"/>
<Button
android:id="@+id/login_button_login"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:text="登陆"/>
</LinearLayout>
</LinearLayout>
4.RegisterActivity.java
public class RegisterActivity extends AppCompatActivity {
private EditText mEditTextName,mEditTextPassword;
private Button mButtonRegister;
private ArrayList<User> mUsers = new ArrayList<>();
//只允许本应用读取
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
init();
mButtonRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = mEditTextName.getText().toString();
String password = mEditTextPassword.getText().toString();
if (!name.equals("")&&!password.equals("")){
User user = new User(name,password);
mUsers = read();//获取已经注册的集合
if (!judge(user)){//如果不存在
mUsers.add(user);
write(mUsers);
Toast.makeText(RegisterActivity.this,"注册成功快去登陆吧",Toast.LENGTH_LONG).show();
}else {
Toast.makeText(RegisterActivity.this,"用户名已经存在",Toast.LENGTH_SHORT).show();
}
}else {
Toast.makeText(RegisterActivity.this,"用户名或密码为空",Toast.LENGTH_SHORT).show();
}
}
});
}
private void init(){
mEditTextName = findViewById(R.id.register_edit_name);
mEditTextPassword = findViewById(R.id.register_edit_password);
mButtonRegister = findViewById(R.id.register_button_register);
}
/**
* 判断user是否已经在list里了
* */
private boolean judge(User user){
boolean flag = false;
for (User u:mUsers){
//用户名重复
if (user.name.equals(u.name)){
flag = true;
}
}
return flag;
}
/**
* 读取数据
* */
private ArrayList<User> read(){
SharedPreferences mSharedPreferences = getSharedPreferences("userLoginInfo",MODE_PRIVATE);
String json = mSharedPreferences.getString("data","");
ArrayList<User> users = new ArrayList<>();
if (!json.equals("")){
users = (ArrayList<User>) JSON.parseArray(json,User.class);
}
return users;
}
/**
* 写入数据
* */
private void write(ArrayList<User> users){
SharedPreferences mSharedPreferences = getSharedPreferences("userLoginInfo",MODE_PRIVATE);
SharedPreferences.Editor mEdit = mSharedPreferences.edit();
String json = JSON.toJSONString(users);
mEdit.putString("data",json);
mEdit.commit();
}
//打开自己的方法
public static Intent createIntent(Context context){
return new Intent(context,RegisterActivity.class);
}
}
5.对应布局文件 activity_register.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<TextView
android:layout_width="60dp"
android:layout_marginLeft="10dp"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="账号:"/>
<EditText
android:id="@+id/register_edit_name"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="5"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<TextView
android:layout_width="60dp"
android:layout_marginLeft="10dp"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="密码:" />
<EditText
android:id="@+id/register_edit_password"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="5"
android:inputType="textPassword"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="20dp"
android:orientation="vertical">
<Button
android:id="@+id/register_button_register"
android:layout_width="100dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:text="注册"/>
</LinearLayout>
</LinearLayout>
6.User.java
注意得实现Serializable接口
import java.io.Serializable;
public class User implements Serializable {
public String name;
public String password;
public User(String name, String password) {
this.name = name;
this.password = password;
}
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
总结
如果有什么问题或改进方案,请私信联系我或者在评论区留言
码字不易,若有帮助,给个关注和赞呗