将EditText和button美化。
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="15dp" /> <padding android:left="20dp" android:right="20dp" android:top="20dp" android:bottom="20dp"/> <solid android:color="#5a5aad"/> </shape>新建一个Drawable resource file将根节点改为shape。shape设置为矩形,corners设置圆角半径,padding设置内间距、solid设置背景颜色。放在drawable文件夹下。
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/custom_button_unpress" android:state_pressed="false"></item> <item android:drawable="@drawable/custom_button_press" android:state_pressed="true"></item> </selector>为按钮设置未点击时的样式和点击时的样式。
新建两个Drawable resource file将根节点改为shape。shape设置为矩形,corners设置圆角半径,padding设置内间距、solid设置背景颜色。
创建两个shape文件之后,再创建一个Drawable resource file根节点为selector。通过item设置点击时和未点击时分别为哪个shape文件的样式。
注册功能:
首先判断输入是否为空!为空时提示。
然后用leancloud来查询是否该用户已存在,已存在时提示。不为空时用leancloud添加。因为查询添加都是访问leancloud即访问网络。需要新建子线程。
注意:在查询中,如果该用户已存在我们通过定义一个标志flag(初始化为false),令flag为true。判断如果flag为true则return,令其不再往下执行注册代码。
在return把flag赋为false,是避免用户第一次注册时用户名已存在这时flag已经为true,第二次注册就还是true导致就算用户名可以注册还是注册不了。
new Thread(new Runnable() { @Override public void run() { AVQuery<AVObject> avQuery = new AVQuery<>("exam"); avQuery.findInBackground(new FindCallback<AVObject>() { @Override public void done(List<AVObject> list, AVException e) { for (AVObject obj : list) { String query_account = obj.getString("account"); if (query_account.equals(account)) { Toast.makeText(getApplicationContext(), "该用户名已存在!", Toast.LENGTH_SHORT).show(); flag = true; break; } } if (flag) { flag = false; return; } addAccount(); } }); } }).start();
public void addAccount(){ AVObject avObject = new AVObject("exam"); avObject.put("account",account); avObject.put("password", password); avObject.saveInBackground(new SaveCallback() { @Override public void done(AVException e) { if (e == null) { Toast.makeText(getApplicationContext(), "注册成功!可以登录了!", Toast.LENGTH_SHORT).show(); } else Toast.makeText(getApplicationContext(), "注册失败!e:" + e, Toast.LENGTH_SHORT).show(); } }); startActivity(new Intent(RegisterActivity.this,LoginActivity.class)); finish(); }
登陆功能:
首先判断输入是否为空!为空时提示。
然后用leancloud查询该账号密码是否匹配。不匹配时提示。匹配时跳转页面。同样是访问网络所以需要新建子线程。
这里同样初始化一个flag为false,如果账号密码匹配成功则令flag为true,这时则登陆成功跳转。否则用户名密码错误,弹出提示。
如果用户连续输入3次错误,则将EditText设置为不可获取焦点。初始化一个num为0,每输入错一次就自增,当num大于等于3时,设置为不可获取焦点。
new Thread(new Runnable() { @Override public void run() { AVQuery<AVObject> avQuery = new AVQuery<>("exam"); avQuery.findInBackground(new FindCallback<AVObject>() { @Override public void done(List<AVObject> list, AVException e) { for (AVObject obj : list){ if (obj.getString("account").equals(account) && obj.getString("password").equals(password)){ flag = true; break; } } if (flag){ Toast.makeText(getApplicationContext(),"登陆成功!",Toast.LENGTH_SHORT).show(); startActivity(new Intent(LoginActivity.this,WelcomeActivity.class)); finish(); }else { Toast.makeText(getApplicationContext(),"用户名密码错误!",Toast.LENGTH_SHORT).show(); num++; if (num >= 3){ holder.et_account.setFocusable(false); holder.et_password.setFocusable(false); Toast.makeText(getApplicationContext(),"已限制登陆",Toast.LENGTH_SHORT).show(); } } } }); } }).start();
登陆功能里需要判断是否保存账号密码:分别为不保存、保存账号、保存密码账号。
if (holder.rb_no_rem.isChecked()){ editor.remove("account"); editor.remove("password"); editor.commit(); }else if (holder.rb_rem_account.isChecked()){ editor.putString("account",account); editor.commit(); }else if (holder.rb_rem_account_password.isChecked()){ editor.putString("account",account); editor.putString("password",password); editor.commit(); }
这时页面登陆页面初始化的时候可以这样:
sp = getSharedPreferences("user", MODE_PRIVATE); editor = sp.edit(); String a = sp.getString("account",""); String p = sp.getString("password", ""); holder.et_account.setText(a); holder.et_password.setText(p); if (TextUtils.isEmpty(a)){ holder.rb_no_rem.setChecked(true); }else if (!TextUtils.isEmpty(a) && !TextUtils.isEmpty(p)){ holder.rb_rem_account_password.setChecked(true); }else{ holder.rb_rem_account.setChecked(true); }这样可以即给EditText赋值也可以设置RadioButton的默认选中状态。