首先,上图看效果:
接下来是看如何实现。
1,loginActivity
/**
* 登录界面
*/
public class LoginActivity extends Activity
implements View.OnClickListener, CompoundButton.OnCheckedChangeListener {
//布局内的控件
private EditText et_name;
private EditText et_password;
private Button mLoginBtn;
private Button mRegisterBtn;
private CheckBox checkBox_password;
private CheckBox checkBox_login;
private ImageView iv_see_password;
static String currentLoginCount = "";
static String currentpassword = "";
private LoadingDialog mLoadingDialog; //显示正在加载的对话框
private UserDataManager mUserDataManager; //用户数据管理类
/* private static final String DATABASE_NAME = "Mydb";
private static final String TABLE_NAME = "MyLoginDB";
private SQLiteDatabase sqlDB;
public static final String ID = "_id";
public static final String USERID = "customName";
public static final String PASSWORD = "password";*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initViews();
setupEvents();
initData();
if (mUserDataManager == null) {
mUserDataManager = new UserDataManager(this);
mUserDataManager.openDataBase(); //建立本地数据库
}
// sqlDB = openOrCreateDatabase(DATABASE_NAME,SQLiteDatabase.CREATE_IF_NECESSARY,null);
/*
* 初始化数据库
*/
// sqlDB.execSQL("drop table if exists "+TABLE_NAME );//删除数据库中的表
//sqlDB.execSQL("DELETE FROM " + TABLE_NAME);//删除表中所有数据但保留表
// Toast.makeText(getApplicationContext(),"数据库创建成功",Toast.LENGTH_SHORT).show();
/* try {
sqlDB.execSQL("create table " + TABLE_NAME + " ( "+
ID + " integer primary key,"+
USERID + " varchar,"+
PASSWORD+ " varchar "+
")");
}catch(Exception e){
//Toast.makeText(getApplicationContext(),"表格已经存在",Toast.LENGTH_SHORT).show();
}*/
}
private void initData() {
//判断用户第一次登陆
if (firstLogin()) {
checkBox_password.setChecked(false);//取消记住密码的复选框
checkBox_login.setChecked(false);//取消自动登录的复选框
}
//判断是否记住密码
if (remenberPassword()) {
checkBox_password.setChecked(true);//勾选记住密码
setTextNameAndPassword();//把密码和账号输入到输入框中
} else {
setTextName();//把用户账号放到输入账号的输入框中
}
//判断是否自动登录
if (autoLogin()) {
checkBox_login.setChecked(true);
login();//去登录就可以
}
}
/**
* 把本地保存的数据设置数据到输入框中
*/
public void setTextNameAndPassword() {
et_name.setText("" + getLocalName());
et_password.setText("" + getLocalPassword());
}
/**
* 设置数据到输入框中
*/
public void setTextName() {
et_name.setText("" + getLocalName());
}
/**
* 获得保存在本地的用户名
*/
public String getLocalName() {
//获取SharedPreferences对象,使用自定义类的方法来获取对象
SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");
String name = helper.getString("name");
return name;
}
/**
* 获得保存在本地的密码
*/
public String getLocalPassword() {
//获取SharedPreferences对象,使用自定义类的方法来获取对象
SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");
String password = helper.getString("password");
return Base64Utils.decryptBASE64(password); //解码一下
// return password; //解码一下
}
/**
* 判断是否自动登录
*/
private boolean autoLogin() {
//获取SharedPreferences对象,使用自定义类的方法来获取对象
SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");
boolean autoLogin = helper.getBoolean("autoLogin", false);
return autoLogin;
}
/**
* 判断是否记住密码
*/
private boolean remenberPassword() {
//获取SharedPreferences对象,使用自定义类的方法来获取对象
SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");
boolean remenberPassword = helper.getBoolean("remenberPassword", false);
return remenberPassword;
}
private void initViews() {
mLoginBtn = (Button) findViewById(R.id.btn_login);
mRegisterBtn = (Button) findViewById(R.id.btn_register);
et_name = (EditText) findViewById(R.id.et_account);
et_password = (EditText) findViewById(R.id.et_password);
checkBox_password = (CheckBox) findViewById(R.id.checkBox_password);
checkBox_login = (CheckBox) findViewById(R.id.checkBox_login);
iv_see_password = (ImageView) findViewById(R.id.iv_see_password);
}
private void setupEvents() {
mLoginBtn.setOnClickListener(this);
mRegisterBtn.setOnClickListener(this);
checkBox_password.setOnCheckedChangeListener(this);
checkBox_login.setOnCheckedChangeListener(this);
iv_see_password.setOnClickListener(this);
}
/**
* 判断是否是第一次登陆
*/
private boolean firstLogin() {
//获取SharedPreferences对象,使用自定义类的方法来获取对象
SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");
boolean first = helper.getBoolean("first", true);
if (first) {
//创建一个ContentVa对象(自定义的)设置不是第一次登录,,并创建记住密码和自动登录是默认不选,创建账号和密码为空
helper.putValues(new SharedPreferencesUtils.ContentValue("first", false),
new SharedPreferencesUtils.ContentValue("remenberPassword", false),
new SharedPreferencesUtils.ContentValue("autoLogin", false),
new SharedPreferencesUtils.ContentValue("name", ""),
new SharedPreferencesUtils.ContentValue("password", ""));
return true;
}
return false;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_login:
loadUserName(); //无论如何保存一下用户名
login(); //登陆
break;
case R.id.iv_see_password:
setPasswordVisibility(); //改变图片并设置输入框的文本可见或不可见
break;
case R.id.btn_register:
startActivity(new Intent(this,RegisterActivity.class));
finish();
break;
}
}
private void login() {
//先做一些基本的判断,比如输入的用户命为空,密码为空,网络不可用多大情况,都不需要去链接服务器了,而是直接返回提示错误
if (getAccount().isEmpty()){
showToast("你输入的账号为空!");
return;
}
if (getPassword().isEmpty()){
showToast("你输入的密码为空!");
return;
}
//showToast(getAccount());
/* if (!user(getAccount())){
showToast("账户不存在");
return;
}*/
//登录一般都是请求服务器来判断密码是否正确,要请求网络,要子线程
showLoading();//显示加载框
Thread loginRunnable = new Thread() {
@Override
public void run() {
super.run();
setLoginBtnClickable(false);//点击登录后,设置登录按钮不可点击状态
if (!isUserNameAndPwdValid()){
return ;
}
currentLoginCount = getAccount();
int result=mUserDataManager.findUserByNameAndPwd(getAccount(), getPassword());
if(result==1){ //返回1说明用户名和密码均正确
startActivity(new Intent(LoginActivity.this, MainActivity.class));
finish();
showToast(getString(R.string.login_success));//登录成功提示
}else if(result==0){
showToast(getString(R.string.login_fail)); //登录失败提示
}
setLoginBtnClickable(true); //这里解放登录按钮,设置为可以点击
hideLoading();//隐藏加载框
}
};
loginRunnable.start();
}
private boolean isUserNameAndPwdValid() {
//showToast(userName.getText().toString().trim());
if (getAccount().equals("")) {
showToast(getString(R.string.account_empty));
return false;
} else if (getPassword().equals("")) {
showToast(getString(R.string.pwd_empty));
return false;
}
return true;
}
/*
* 查询数据库看账号是否已经注册过了
*/
/* private boolean user(String username) {
Cursor cur = sqlDB.query(TABLE_NAME, null, USERID+"=?",
new String[] { username }, null, null, null);
while (cur.moveToNext()) {
String user = cur.getString(1);
Log.v("db_query", user);
if (user.equals(username)) {
return true;
} else
return false;
}
return false;
}*/
/**
* 保存用户账号
*/
public void loadUserName() {
if (!getAccount().equals("") || !getAccount().equals("请输入登录账号")) {
SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");
helper.putValues(new SharedPreferencesUtils.ContentValue("name", getAccount()));
}
}
/**
* 设置密码可见和不可见的相互转换
*/
private void setPasswordVisibility() {
if (iv_see_password.isSelected()) {
iv_see_password.setSelected(false);
//密码不可见
et_password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
} else {
iv_see_password.setSelected(true);
//密码可见
et_password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
}
}
/**
* 获取账号
*/
public String getAccount() {
return et_name.getText().toString().trim();//去掉空格
}
/**
* 获取密码
*/
public String getPassword() {
return et_password.getText().toString().trim();//去掉空格
}
/**
* 保存用户选择“记住密码”和“自动登陆”的状态
*/
private void loadCheckBoxState() {
loadCheckBoxState(checkBox_password, checkBox_login);
}
/**
* 保存按钮的状态值
*/
public void loadCheckBoxState(CheckBox checkBox_password, CheckBox checkBox_login) {
//获取SharedPreferences对象,使用自定义类的方法来获取对象
SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");
//如果设置自动登录
if (checkBox_login.isChecked()) {
//创建记住密码和自动登录是都选择,保存密码数据
helper.putValues(
new SharedPreferencesUtils.ContentValue("remenberPassword", true),
new SharedPreferencesUtils.ContentValue("autoLogin", true),
new SharedPreferencesUtils.ContentValue("password", Base64Utils.encryptBASE64(getPassword())));
} else if (!checkBox_password.isChecked()) { //如果没有保存密码,那么自动登录也是不选的
//创建记住密码和自动登录是默认不选,密码为空
helper.putValues(
new SharedPreferencesUtils.ContentValue("remenberPassword", false),
new SharedPreferencesUtils.ContentValue("autoLogin", false),
new SharedPreferencesUtils.ContentValue("password", ""));
} else if (checkBox_password.isChecked()) { //如果保存密码,没有自动登录
//创建记住密码为选中和自动登录是默认不选,保存密码数据
helper.putValues(
new SharedPreferencesUtils.ContentValue("remenberPassword", true),
new SharedPreferencesUtils.ContentValue("autoLogin", false),
new SharedPreferencesUtils.ContentValue("password", Base64Utils.encryptBASE64(getPassword())));
}
}
/**
* 是否可以点击登录按钮
*
* @param clickable
*/
public void setLoginBtnClickable(boolean clickable) {
mLoginBtn.setClickable(clickable);
}
/**
* 显示加载的进度款
*/
public void showLoading() {
if (mLoadingDialog == null) {
mLoadingDialog = new LoadingDialog(this, getString(R.string.loading), false);
}
mLoadingDialog.show();
}
/**
* 隐藏加载的进度框
*/
public void hideLoading() {
if (mLoadingDialog != null) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mLoadingDialog.hide();
}
});
}
}
/**
* CheckBox点击时的回调方法 ,不管是勾选还是取消勾选都会得到回调
*
* @param buttonView 按钮对象
* @param isChecked 按钮的状态
*/
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (buttonView == checkBox_password) { //记住密码选框发生改变时
if (!isChecked) { //如果取消“记住密码”,那么同样取消自动登陆
checkBox_login.setChecked(false);
}
} else if (buttonView == checkBox_login) { //自动登陆选框发生改变时
if (isChecked) { //如果选择“自动登录”,那么同样选中“记住密码”
checkBox_password.setChecked(true);
}
}
}
/**
* 监听回退键
*/
@Override
public void onBackPressed() {
if (mLoadingDialog != null) {
if (mLoadingDialog.isShowing()) {
mLoadingDialog.cancel();
} else {
finish();
}
} else {
finish();
}
}
/**
* 页面销毁前回调的方法
*/
@Override
protected void onDestroy() {
if (mLoadingDialog != null) {
mLoadingDialog.cancel();
mLoadingDialog = null;
}
super.onDestroy();
}
public void showToast(final String msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(LoginActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
}
}
2, registerActivity的实现:
/*
*注册界面
*/
public class RegisterActivity extends Activity {
EditText userName;
EditText userPwd;
EditText repeat;
Button register;
Button login;
private UserDataManager mUserDataManager; //用户数据管理类
/**
* 正则匹配:
* [a-zA-Z]:字母开头
* \\w :可包含大小写字母,数字,下划线,@
* {5,17} 5到17位,加上开头字母 字符串长度6到18
*/
private String userIdFromat = "[a-zA-Z](@?+\\w){4,16}+"; //加入正则匹配
/**
* 正则匹配
* \\w{6,18}匹配所有字母、数字、下划线 字符串长度6到18(不含空格)
*/
private String userPwdFormat = "\\w{6,18}+";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
userName = (EditText)findViewById(R.id.editText3);
userPwd = (EditText)findViewById(R.id.editText4);
repeat = (EditText)findViewById(R.id.editText5);
register = (Button)findViewById(R.id.button3);
login = (Button)findViewById(R.id.button4);
if (mUserDataManager == null) {
mUserDataManager = new UserDataManager(this);
mUserDataManager.openDataBase(); //建立本地数据库
}
register.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
if (!isUserNameAndPwdValid()){
return ;
}
//检查用户是否存在
int count=mUserDataManager.findUserByName(userName.getText().toString());
//用户已经存在时返回,给出提示文字
if(count>0){
showToast(getString(R.string.name_already_exist));
return ;
}
if (!userName.getText().toString().matches(userPwdFormat)){
showToast(getString(R.string.wrong_usename_format));
return ;
}
if (!userPwd.getText().toString().matches(userPwdFormat)){
showToast(getString(R.string.wrong_pwd_format));
return ;
}
if(userPwd.getText().toString().equals(repeat.getText().toString())==false){ //两次密码输入不一样
showToast(getString(R.string.pwd_not_the_same));
return ;
} else {
UserData mUser = new UserData(userName.getText().toString(), userPwd.getText().toString());
mUserDataManager.openDataBase();
long flag = mUserDataManager.insertUserData(mUser); //新建用户信息
if (flag == -1) {
showToast(getString(R.string.register_fail));
}else{
showToast(getString(R.string.register_success));
Intent intent_Register_to_Login = new Intent(getApplicationContext(),LoginActivity.class) ; //切换User Activity至Login Activity
startActivity(intent_Register_to_Login);
finish();
}
}
}
/*boolean isNameExist =user(userName.getText().toString());
if(!isNameExist && !userName.getText().toString().equals("") && !userPwd.getText().toString().equals("") && !repeat.getText().toString().equals("")) {
if (userName.getText().toString().matches(userIdFromat))
{
if(repeat.getText().toString().equals(userPwd.getText().toString())){
Log.v("register", userPwd.getText().toString().matches(userPwdFormat) +"");
if (userPwd.getText().toString().matches(userPwdFormat)){
ContentValues cv = new ContentValues();
cv.put(USERID, userName.getText().toString());
cv.put(userPwd, userPwd.getText().toString());
sqlDB.insertOrThrow(TABLE_NAME,null,cv);
Intent i = new Intent(getApplicationContext(),LoginActivity.class);
startActivity(i);
Toast.makeText(getApplicationContext(),"注册成功,请登录",Toast.LENGTH_SHORT).show();
finish();
} else {
Toast.makeText(getApplicationContext(),"请输入6-18位密码,可包含数字,字母下划线",Toast.LENGTH_SHORT).show();
}
} else {
//Toast.makeText(getApplicationContext(),id.getText().toString() +" " + userPwd.getText().toString() +" "+ repeat.getText().toString(),Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(),"两次输入的密码不一致 ",Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getApplicationContext(),"请输入5-18位字母开头用户名,可包括数字,字母下划线",Toast.LENGTH_SHORT).show();
}
}else if (isNameExist){
Toast.makeText(getApplicationContext(),"账户已存在,请返回登录 ",Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(getApplicationContext(),"输入不能为空",Toast.LENGTH_SHORT).show();
// Toast.makeText(getApplicationContext(),id.getText().toString() +" " + userPwd.getText().toString() +" "+ repeat.getText().toString(),Toast.LENGTH_SHORT).show();
}
}*/
});
login.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(getApplicationContext(),LoginActivity.class);
startActivity(i);
finish();
}
});
}
private boolean isUserNameAndPwdValid() {
//showToast(userName.getText().toString().trim());
if (userName.getText().toString().trim().equals("")) {
showToast(getString(R.string.account_empty));
return false;
} else if (userPwd.getText().toString().trim().equals("")) {
showToast(getString(R.string.pwd_empty));
return false;
}else if(repeat.getText().toString().trim().equals("")) {
showToast(getString(R.string.pwd_check_empty));
return false;
}
return true;
}
public void showToast(final String msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(RegisterActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
}
/**
* 监听回退键
*/
@Override
public void onBackPressed() {
finish();
}
}
3,数据库管理
采用SQLite ,以及sharePrefermance “
public class UserDataManager { //用户数据管理类
//一些宏定义和声明
private static final String TAG = "UserDataManager";
private static final String DB_NAME = "user_data";
private static final String TABLE_NAME = "users";
public static final String ID = "_id";
public static final String USER_NAME = "user_name";
public static final String USER_PWD = "user_pwd";
// public static final String SILENT = "silent";
// public static final String VIBRATE = "vibrate";
private static final int DB_VERSION = 2;
private Context mContext = null;
//创建用户book表
private static final String DB_CREATE = "CREATE TABLE " + TABLE_NAME + " ("
+ ID + " integer primary key,"
+ USER_NAME + " varchar,"
+ USER_PWD + " varchar" + ");";
private SQLiteDatabase mSQLiteDatabase = null;
private DataBaseManagementHelper mDatabaseHelper = null;
//DataBaseManagementHelper继承自SQLiteOpenHelper
private static class DataBaseManagementHelper extends SQLiteOpenHelper {
DataBaseManagementHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.v(TAG,"db.getVersion()="+db.getVersion());
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME + ";");
db.execSQL(DB_CREATE);
Log.v(TAG, "db.execSQL(DB_CREATE)");
Log.e(TAG, DB_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.v(TAG, "DataBaseManagementHelper onUpgrade");
onCreate(db);
}
}
public UserDataManager(Context context) {
mContext = context;
Log.v(TAG, "UserDataManager construction!");
}
//打开数据库
public void openDataBase() throws SQLException {
mDatabaseHelper = new DataBaseManagementHelper(mContext);
mSQLiteDatabase = mDatabaseHelper.getWritableDatabase();
}
//关闭数据库
public void closeDataBase() throws SQLException {
mDatabaseHelper.close();
}
//添加新用户,即注册
public long insertUserData(UserData userData) {
String userName=userData.getUserName();
String userPwd=userData.getUserPwd();
ContentValues values = new ContentValues();
values.put(USER_NAME, userName);
values.put(USER_PWD, userPwd);
return mSQLiteDatabase.insert(TABLE_NAME, ID, values);
}
//更新用户信息,如修改密码
public boolean updateUserData(UserData userData) {
//int id = userData.getUserId();
String userName = userData.getUserName();
String userPwd = userData.getUserPwd();
ContentValues values = new ContentValues();
values.put(USER_NAME, userName);
values.put(USER_PWD, userPwd);
return mSQLiteDatabase.update(TABLE_NAME, values,null, null) > 0;
//return mSQLiteDatabase.update(TABLE_NAME, values, ID + "=" + id, null) > 0;
}
//
public Cursor fetchUserData(int id) throws SQLException {
Cursor mCursor = mSQLiteDatabase.query(false, TABLE_NAME, null, ID
+ "=" + id, null, null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
//
public Cursor fetchAllUserDatas() {
return mSQLiteDatabase.query(TABLE_NAME, null, null, null, null, null,
null);
}
//根据id删除用户
public boolean deleteUserData(int id) {
return mSQLiteDatabase.delete(TABLE_NAME, ID + "=" + id, null) > 0;
}
//根据用户名注销
public boolean deleteUserDatabyname(String name) {
return mSQLiteDatabase.delete(TABLE_NAME, USER_NAME + "=" + name, null) > 0;
}
//删除所有用户
public boolean deleteAllUserDatas() {
return mSQLiteDatabase.delete(TABLE_NAME, null, null) > 0;
}
//
public String getStringByColumnName(String columnName, int id) {
Cursor mCursor = fetchUserData(id);
int columnIndex = mCursor.getColumnIndex(columnName);
String columnValue = mCursor.getString(columnIndex);
mCursor.close();
return columnValue;
}
//
public boolean updateUserDataById(String columnName, int id,
String columnValue) {
ContentValues values = new ContentValues();
values.put(columnName, columnValue);
return mSQLiteDatabase.update(TABLE_NAME, values, ID + "=" + id, null) > 0;
}
//根据用户名找用户,可以判断注册时用户名是否已经存在
public int findUserByName(String userName){
Log.v(TAG,"findUserByName , userName="+userName);
int result=0;
Cursor cur = mSQLiteDatabase.query(TABLE_NAME, null, USER_NAME+"=?",
new String[] { userName },null, null, null);
while (cur.moveToNext()) {
String user = cur.getString(1);
Log.v("db_query", user);
if (user.equals(userName)) {
cur.close();
return 1;
} else
cur.close();
return 0;
}
Log.v(TAG,"findUserByName , result="+result);
return result;
}
//根据用户名和密码找用户,用于登录
public int findUserByNameAndPwd(String userName, String pwd){
Log.v(TAG,"findUserByNameAndPwd");
int result=0;
Cursor cur = mSQLiteDatabase.query(TABLE_NAME, null, USER_NAME+"=?",
new String[] { userName },null, null, null);
while (cur.moveToNext()) {
String user = cur.getString(2);
Log.v("db_query", user);
if (pwd.equals(user)) {
cur.close();
return 1;
} else
{
cur.close();
return 0;
}
}
return result;
}
最后的效果gif 图如下:
其他资源文件等在下面的demo里,我就不贴出来了。欢迎下载
https://download.csdn.net/download/linzihahaha/10763892
ps:这个是我根据网上资源自己修改的,数据库有分开dataManager 和userData,这样方便管理,侵删。