Android仿QQ即时聊天软件开发(二)---注册、登录、找回密码

写在前面

接前面一篇博客,前面介绍了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("");
        }
    }
好啦!今天的内容就这些,具体的代码后期会上传到github。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容