写在前面
接前面一篇博客,前面介绍了app的大体功能,接下来将对这个Demo拆分成几个部分来详细介绍其中的布局、实现的原理、用到的技术等。对了,这个Demo的服务器代码也会在后面的文章中单独的介绍。
效果图
589794954816801081.jpg
具体的实现
界面分析
login布局分析2.jpg
具体功能
1.用两个EditText接收用户输入的账号密码;
2.一个按钮接收用户登录事件;
3.用TextView来提示“忘记密码”和“注册账号”入口;
4.可以查看用户服务条款。
账号密码输入框:使用自定义的样式改变光标颜色、下划线颜色、选中文本的背景颜色等。
<style name="LoginEditTextTheme" parent="AccountTextStyle">
<item name="android:textColorHint">@color/alpha70_white</item>
<!--光标颜色-->
<item name="android:textCursorDrawable">@drawable/cursor</item>
<item name="android:theme">@style/Theme.Custom.Control.EditText</item>
<!--下划线颜色-->
<item name="android:backgroundTint">@color/transparent</item>
<!--选中文本的背景颜色-->
<item name="android:textColorHighlight">@color/alpha50_light_green</item>
<!--<item name="android:textSelectHandle">@color/alpha90_green</item>-->
<!--小水滴图标-->
<item name="android:textSelectHandleLeft">@drawable/custom_text_select_handle_left_material</item>
<item name="android:textColorHighlightInverse">@drawable/custom_text_select_handle_middle_material</item>
<item name="android:textSelectHandleRight">@drawable/custom_text_select_handle_right_material</item>
</style>
在输入框后面使用一个CheckBox来实现下拉历史账号的功能。
<EditText
android:id="@+id/et_input_account"
style="@style/LoginEditTextTheme"
android:layout_width="wrap_content"
android:layout_height="@dimen/input_account_edit_text_height"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginEnd="10dp"
android:layout_toStartOf="@+id/iv_clear_account"
android:hint="@string/input_account"
android:inputType="number" />
<ImageView
android:id="@+id/iv_clear_account"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_toStartOf="@id/cb_login_drop_down"
android:layout_centerVertical="true"
android:layout_marginTop="10dp"
android:layout_marginEnd="10dp"
android:src="@mipmap/clear" />
<CheckBox
android:id="@+id/cb_login_drop_down"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginTop="10dp"
android:layout_marginEnd="10dp"
android:background="@drawable/account_drop_down"
android:button="@null"/>
忘记密码:使用自定义样式改变其颜色等
<style name="ClickableTextView">
<item name="android:textColor">@drawable/bg_hypertext</item>
<item name="android:clickable">true</item>
<item name="android:focusable">true</item>
</style>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_forget_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/login_forget_password"
style="@style/ClickableTextView" />
<TextView
android:id="@+id/tv_register_account"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_marginTop="20dp"
android:text="@string/login_register"
style="@style/ClickableTextView"/>
</RelativeLayout>
注册功能的实现
1.接收用户的个人信息。这里使用SharedPreferences存储方式保存用户信息
2.注册时有两次密码的输入,并且进行比较;
3.注册成功后采用弹窗的方式提示随机生成的用户账号,并且将账号保存到手机中。
SharedPreferences存储
Android 中的 SharedPreference 是轻量级的数据存储方式,能够保存简单的数据类型,比如 String、int、boolean 值等。其内部是以 XML 结构保存在 /data/data/包名/shared_prefs 文件夹下,数据以键值对的形式保存。下面就是这个demo中的数据存储的例子:
(这里只是简单的介绍!!)
// 创建SharedPreferences对象
SharedPreferences shp = context.getSharedPreferences("USER_DATA",Context.MODE_PRIVATE);
// 创建Editor对象写入值
SharedPreferences.Editor editor = shp.edit();
// 写入注册时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日" + "hh:mm:ss");
editor.putString("register_time", sdf.format(new Date()));
注册时用户密码比较与保存
private String register(EditText rUserPsd, EditText rUserAgainPad) {
String first_psa = rUserPsd.getText().toString();
String again_psa = rUserAgainPad.getText().toString();
// 判断密码是否一致
if (first_psa.equals(again_psa)){
// 两次密码一致
showExitDialog();
// Toast.makeText(Register.this,"注册成功,账号为:666666",Toast.LENGTH_SHORT).show();
// 跳转
// inten();
return first_psa;
}else {
// 密码不一致,重新输入
Toast.makeText(Register.this,"两次密码不一致,重新输入",Toast.LENGTH_SHORT).show();
rUserAgainPad.setText("");
rUserAddress.setText("");
}
return null;
}
用户信息写入
public class SaveRegisterData {
public EditText UserName; // 昵称
public EditText UserPsd; // 密码
public int UserGender; // 性别
public EditText UserAddress; // 地址
private Context context;
public SaveRegisterData(Context context){
this.context = context;
}
public void save(EditText inUserName, String inUserPsd, int inGunder, EditText inUserAddress,String inUserNumber){
String saveName = inUserName.getText().toString();//接收用户名EditText内容
String savepsd = inUserPsd;//接收密码EditText内容
//String againpsd = inAgainPsd.getText().toString();//接收密码EditText内容
String saveAddress = inUserAddress.getText().toString();//接收地址EditText内容
// 创建SharedPreferences对象
SharedPreferences shp = context.getSharedPreferences("USER_DATA",Context.MODE_PRIVATE);
// 创建Editor对象写入值
SharedPreferences.Editor editor = shp.edit();
// 写入注册时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日" + "hh:mm:ss");
editor.putString("register_time", sdf.format(new Date()));
// 写入用户信息
editor.putString("UserName", saveName);
editor.putString("UserPsd", savepsd);
if (inGunder==0){
editor.putString("UserGender","男");
}else if (inGunder == 1){
editor.putString("UserGender","女");
}else {
editor.putString("UserGender","未知");
}
editor.putString("UserAddress", saveAddress);
editor.putString("UserNumber",inUserNumber);
editor.commit();
}
// public String outData(){
// // 创建SharedPreferences对象
// SharedPreferences shp_out = context.getSharedPreferences("USER_DATA",Context.MODE_PRIVATE);
// // 创建Editor对象写入值
// SharedPreferences.Editor editor = shp_out.edit();
// return shp_out.getString("UserNumber","");
// }
}
随机生成账号
这里只随机生成六位数的账号
// 生成随机账号
public String random(){
String strRand="" ;
for(int i=0;i<6;i++){
strRand += String.valueOf((int)(Math.random() * 10)) ;
}
return strRand;
}
提示用户的账号
// 生成账号提示框
public void showExitDialog(){
new AlertDialog.Builder(this)
.setTitle("注册成功")
.setMessage("账号:"+UserNumber)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
inten();
}
})
.show();
}
找回密码功能实现
由于能力有限,通过邮箱等方式找回密码后期再来补充,这里提供的是:用户输入昵称和账号找回;
原理:提取出存储在手机中的昵称和账号,如果两者都匹配,则返回密码
private void findpsd() {
// 获取输入
String number = fUserNumber.getText().toString();
String phoneNumber = fUserPhoneNumber.getText().toString();
UpRegisterData upRegisterData = new UpRegisterData(getApplicationContext());
String user_num = upRegisterData.Up_user_number();
String user_name = upRegisterData.Up_user_name();
user_passwprd = upRegisterData.Up_user_password();
// System.out.println(name);
// System.out.println(pass);
if (user_num.equals(number) && user_name.equals(phoneNumber)){
// 提示成功
//Toast.makeText(FindPsd.this,"已将相关信息发送至邮箱",Toast.LENGTH_SHORT).show();
showExitDialog();
}else if (number==null || phoneNumber==null){
Toast.makeText(FindPsd.this,"请输入账号与绑定手机号",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(FindPsd.this,"输入信息有误,请重新输入",Toast.LENGTH_SHORT).show();
// 清空输入框的内容
fUserNumber.setText("");
fUserPhoneNumber.setText("");
}
}