登录注册
# 界面一 activity_main ---- 成功登陆以后的主界面
- TextView 控件:欢迎进入XXX系统
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
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="example.demo0904.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="欢迎进入XXX系统"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
# 界面二 activity_user_login --- 登录界面
- 线性布局
· ImageView 【logo】
· EditText X2 【用户名输入 and 密码输入】
· Button 【登陆按钮】
~ 监听 doLogin
· TextView 【注册选项】
~ 监听 doRegister
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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"
android:padding="10dp"
tools:context="example.demo0904.UserLoginActivity">
<ImageView
android:id="@+id/imageView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:srcCompat="@drawable/im_logo"/>
<EditText
android:id="@+id/id_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="请输入用户名 "
android:inputType="textPersonName"
/>
<EditText
android:id="@+id/id_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="请输入密码"
android:inputType="textPassword"/>
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#7BBCFC"
android:onClick="doLogin"
android:text="登录"
android:textColor="#fff"/>
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:layout_marginTop="30dp"
android:background="#0000"
android:onClick="doRegister"
android:text="点此注册"
android:textAlignment="center"
android:textColor="#7BBCFC"
android:textSize="18sp"/>
</LinearLayout>
# 界面三
- 线性布局
· TextView [用户注册 -- 界面提示]
· EditText X3 [用户名 密码 确认密码]
· Button [确认注册按钮]
~ 监听 doRegister
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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"
android:padding="20dp"
tools:context="example.demo0904.UserRegisterActivity">
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="用户注册"
android:textAlignment="center"
android:textColor="#7BBCFC"
android:textSize="18sp"/>
<EditText
android:id="@+id/id_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:ems="10"
android:hint="请输入用户名"
android:inputType="textPersonName"
/>
<EditText
android:id="@+id/id_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:ems="10"
android:hint="请输入密码"
android:inputType="textPassword"
/>
<EditText
android:id="@+id/id_verify"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:ems="10"
android:hint="确认输入密码"
android:inputType="textPassword"/>
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="#7BBCFC"
android:onClick="doRegister"
android:text="确认注册"
android:textColor="#fff"
android:textSize="18sp"/>
</LinearLayout>
# Global
- 属性:当前用户名
package example.demo0904;
public class Global
{
public static Global i = new Global();
public String username = ""; // 当前用户的名字
}
# MainActivity -- 主界面代码
- 简介:重写onCreate() 加载布局文件 R.layout.activity_main
package example.demo0904;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
# User
- 简介:Class User -- 存储用户信息
- 属性:用户名、密码
- 行为:构造方法
package example.demo0904;
/**
* 存储用户的信息
*/
public class User
{
public String username; // 用户名
public String password; // 密码
public User()
{
}
public User(String username, String password)
{
this.username = username;
this.password = password;
}
}
# UserLoginActivity
- 简介:Class UserLoginActivity -- 登录界面代码
- 行为:重写onCreate()
监听doRegister()
监听doLogin()
延时自动登录autoLogin
- onCreate()
· 布局加载 R.layout.activity_user_login
· 配置加载 SharedPreferences [用户名,密码 自动填写]
- autoLogin()
· 延时1500毫秒后执行一个Runnable线程
- doLogin()
· 读取控件信息 [用户名 && 密码]
· 从文件加载用户信息
· 查找用户
· 对比用户密码
· 保存当先用户信息,下次启动自动填充
· 存放全局对象,方便所有activity使用
· 主界面登录
· 关闭本界面
- doRegister()
· 注册界面跳转
package example.demo0904;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.File;
import static example.demo0904.Global.i;
public class UserLoginActivity extends AppCompatActivity
{
Handler msgHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_login);
// 从配置里加载
SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
String username = sharedPref.getString("username", "");
String password = sharedPref.getString("password", "");
if(username.length() >0 && password.length() > 0)
{
// 自动填写用户名和密码
((EditText) findViewById(R.id.id_username)).setText(username);
((EditText) findViewById(R.id.id_password)).setText(password);
// 延时N毫秒后自动登录
autoLogin();
}
}
// 延时后自动登录
private void autoLogin()
{
msgHandler.postDelayed(new Runnable()
{
@Override
public void run()
{
doLogin(null);
}
}, 1500); // 延时1500毫秒后执行一个Runnable线程 ( 此技术属于 《安卓高级篇》 )
}
// 点击 '登录' 按钮
public void doLogin(View view)
{
// 取得用户界面输入
String username = ((EditText)findViewById(R.id.id_username)).getText().toString();
String password = ((EditText)findViewById(R.id.id_password)).getText().toString();
// 从文件里加载所有用户的数据
File file = new File(getExternalFilesDir(""), "users.txt");
UserManager um = new UserManager(file);
try{
um.load();
}catch (Exception e){}
// 从用户列表里查找用户
User u = um.find(username);
if(u == null)
{
Toast.makeText(this, "无此用户!", Toast.LENGTH_SHORT).show();
return;
}
// 比较密码是否区配
if(! u.password.equals( password))
{
Toast.makeText(this, "密码错误!", Toast.LENGTH_SHORT).show();
return;
}
// 保存当前用户信息,以便下一次开机启动时加载
SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("username", username);
editor.putString("password", password);
editor.commit();
// 登录成功, 把用户信息放在全局对象里, 以便在各个Activity里都可以访问当前用户信息
i.username = username;
// 进入主界面
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish(); // 注意: 关闭本界面, 从MainActivity点返回时应达到桌面, 不应回到登录界面
}
// 点击 '注册' 按钮
public void doRegister(View view)
{
Intent intent = new Intent(this, UserRegisterActivity.class);
startActivity(intent);
}
}
# UserManager
- 简介:UserManager Class
用户信息管理
- 属性:创建一个List来缓存User信息、数据保存到file文件中
- 行为:构造方法,传入file文件
保存信息到文件 save()
加载文件信息 load()
用户注册 add()
用户信息查找 find()
- save() -- 每行存储一个用户的信息,以逗号分隔
· 打开文件流
· 整理信息
· 写入信息
· 关闭文件流
- load()
· 打开文件流
· 清空链表
· 读取信息
· 整理、存入链表
· 关闭文件流
- add()
· 传入新用户信息
· 添加至链表中
- find()
· 链表查询
package example.demo0904;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class UserManager
{
// 创建一个List来缓存User信息
List<User> userlist = new ArrayList();
// 数据保存到这个文件里
File file;
public UserManager(File file)
{
this.file =file;
}
// 保存到文件
public void save() throws Exception
{
// 每行存储一个用户的信息,以逗号分隔
FileOutputStream fstream = new FileOutputStream(file);
for(User u : userlist)
{
String line = u.username + "," + u.password + "\n";
fstream.write( line.getBytes("UTF-8"));
}
fstream.close(); // 此处宜用try{} finally}{} 确保fstream被关闭
}
// 从文件加载
public void load() throws Exception
{
InputStreamReader m = new InputStreamReader(new FileInputStream(file), "UTF-8");
BufferedReader reader = new BufferedReader(m);
userlist.clear(); // 先清空链表
while(true)
{
String line = reader.readLine();
if(line == null) break;
String[] cols = line.split(",");
if(cols.length<2) continue;
User u = new User();
u.username = cols[0].trim();
u.password = cols[1].trim();
userlist.add( u );
}
reader.close(); // reader关闭后,底层的inputstream会被自动关闭
}
// 注册一个用户
public void add(User u)
{
userlist.add(u);
}
// 按名称查找
public User find(String username)
{
for(User u: userlist)
{
if(u.username.equals(username))
{
return u;
}
}
return null;
}
}
# UserRegisterActivity
- 简介:Class UserRegisterActivity 注册界面
- 属性:无
- 行为:onCreate()
监听 doRegister
- onCreate()
· 加载布局文件 R.layout.activity_user_register
- doRegister()
· 获取用户输入
· 判断两次密码是否一致
· 打开文件流
· 加载用户信息
· 检查用户名是否已存在
· 添加用户信息、保存文件
· 返回登录界面
package example.demo0904;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.File;
public class UserRegisterActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_register);
}
public void doRegister(View view)
{
// 取得用户的输入
String username = ((EditText)findViewById(R.id.id_username)).getText().toString();
String password = ((EditText)findViewById(R.id.id_password)).getText().toString();
String verify = ((EditText)findViewById(R.id.id_verify)).getText().toString();
if(!password.equals(verify))
{
Toast.makeText(this, "两次密码输入不一致!", Toast.LENGTH_SHORT).show();
return;
}
// 保存用户信息
File file = new File(getExternalFilesDir(""), "users.txt");
UserManager um = new UserManager(file);
try{
um.load(); // 从users.txt中读取数据
}catch(Exception e){}
// 检查该用户名是否已经存在
if( um.find( username) != null)
{
Toast.makeText(this, "用户名已经存在!", Toast.LENGTH_SHORT).show();
}
else
{
// 添加用户,保存到文件
um.add(new User(username, password));
try
{
um.save();
} catch (Exception e)
{
e.printStackTrace();
}
Toast.makeText(this, "注册成功!", Toast.LENGTH_SHORT).show();
// 返回登录界面
finish();
}
}
}