27. 设置模块(四)之设置密保

作者: Jennyni1122 | 来源:发表于2019-01-10 10:26 被阅读0次

    上一节对欢迎模块进行了综述(可参见 “我”模块(二) 进行了解),接下来将从设置模块开始详细介绍:

    知识点

    • 掌握“收藏”界面的开发,能够实现新闻收藏功能。
    • 掌握“设置”界面的开发,能够设置用户的基本信息。
    • 掌握“修改密码”界面的开发,能够实现密码的修改功能。
    • 掌握“设置密保”界面的开发, 能够实现密保的设置功能。

    10. “设置密保”界面

    任务分析:
    “设置密保”界面主要用于输入要设为密保的姓名,“找回密码”界面可以根据用户当前输入的用户名和设为密保的姓名找回密码,界面效果如图所示。

    “设置密保”界面 “找回密码”界面

    任务实施:
    (1)创建“设置密保”和“找回密码”界面:FindPswActivity & activity_find_psw。

    (2)放置界面控件。
    2个EditText控件,用于输入用户和姓名;
    3个TextView控件,一个用于显示密码(暂时隐藏),其余两个分别用于显示“您的用户名是?”和“您的姓名是?”文字;
    1个Button控件作为“验证”按钮。

    activity_find_psw.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/register_bg_color"
        android:orientation="vertical">
        <include layout="@layout/main_title_bar" />
        <TextView
            android:id="@+id/tv_user_name"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="25dp"
            android:layout_marginRight="25dp"
            android:layout_marginTop="35dp"
            android:text="您的用户名是?"
            android:textColor="@color/constellation_info_color"
            android:textSize="14sp"
            android:visibility="gone" />
        <EditText
            android:id="@+id/et_user_name"
            android:layout_width="fill_parent"
            android:layout_height="40dp"
            android:layout_marginLeft="25dp"
            android:layout_marginRight="25dp"
            android:layout_marginTop="10dp"
            android:background="@drawable/find_psw_radius_bg"
            android:hint="请输入您的用户名"
            android:paddingLeft="8dp"
            android:singleLine="true"
            android:textColor="#000000"
            android:textColorHint="#a3a3a3"
            android:textCursorDrawable="@null"
            android:textSize="14sp"
            android:visibility="gone" />
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="25dp"
            android:layout_marginRight="25dp"
            android:layout_marginTop="15dp"
            android:text="您的姓名是?"
            android:textColor="@color/constellation_info_color"
            android:textSize="14sp" />
        <EditText
            android:id="@+id/et_validate_name"
            android:layout_width="fill_parent"
            android:layout_height="40dp"
            android:layout_marginLeft="25dp"
            android:layout_marginRight="25dp"
            android:layout_marginTop="10dp"
            android:background="@drawable/find_psw_radius_bg"
            android:hint="请输入要验证的姓名"
            android:paddingLeft="8dp"
            android:singleLine="true"
            android:textColor="#000000"
            android:textColorHint="#a3a3a3"
            android:textCursorDrawable="@null"
            android:textSize="14sp" />
        <TextView
            android:id="@+id/tv_reset_psw"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="25dp"
            android:layout_marginRight="25dp"
            android:layout_marginTop="10dp"
            android:gravity="center_vertical"
            android:textColor="@android:color/holo_red_light"
            android:textSize="14sp"
            android:visibility="gone" />
        <Button
            android:id="@+id/btn_validate"
            android:layout_width="fill_parent"
            android:layout_height="35dp"
            android:layout_gravity="center_horizontal"
            android:layout_marginLeft="25dp"
            android:layout_marginRight="25dp"
            android:layout_marginTop="15dp"
            android:background="@drawable/register_btn_selector"
            android:text="验证"
            android:textColor="@android:color/white"
            android:textSize="16sp" />
    </LinearLayout>
    

    (3)创建EditText控件的背景。由于“设置密保”界面的输入框的四个角都是椭圆形,因此在res/drawable中创建一个find_psw_radius_bg.xml文件进行设置。

    find_psw_radius_bg.xml

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <corners android:radius="5dp" />
        <solid android:color="#FFFFFF" />
        <stroke
            android:width="1dp"
            android:color="@color/register_btn_color" />
    </shape>
    

    11. “设置密保”界面逻辑代码

    任务分析:
    根据任务综述可知,“设置密保”界面和“找回密码”界面使用同一个Activty,该Activity主要是根据从“设置”界面和“登录”界面传递过来的from参数的值判断要跳转到那个界面,若值为security,则处理的是“设置密保”界面,否则处理的就是“找回密码”界面。“设置密保”界面的逻辑主要是将用户输入的姓名保存到SharedPreferences中,“找回密码”界面逻辑主要是将SharedPreferences中用户名对应的原始密码修改为123456。

    任务实施:
    (1)获取界面控件。在FindPswActivity中创建界面控件的初始化方法init(),用于获取“修改密码”界面所要用到的控件以及设置后退键,“保存”按钮的点击事件。

    (2)保存密保。由于“设置密保”界面需要将用户输入的姓名保存到SharedPreferences中,因此需要创建saveSecurity()方法进行保存。

    (3)保存初始化密码到SharedPreferences中。在“找回密码”界面创建isExistuserName()方法判断用户输入的用户名是否存在,若存在,则创建readSecurity()方法获取此用户之前设置过的密保,若用户输入的密保和从SharedPreferences中获取的密保一致,则创建savePsw()方法将此用户原来的密码保存为123456(由于原来的密码不能获取明文,因此将此账户的密码重置为初始密码123456)。

    FindPswActivity.java

    public class FindPswActivity extends AppCompatActivity {
        private EditText et_validate_name, et_user_name;
        private Button btn_validate;
        private TextView tv_main_title;
        private TextView tv_back;
        //from为security时是从设置密保界面跳转过来的,否则就是从登录界面跳转过来的
        private String from;
        private TextView tv_reset_psw, tv_user_name;
        private SwipeBackLayout layout;
        private RelativeLayout rl_title_bar;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            layout = (SwipeBackLayout) LayoutInflater.from(this).inflate(
                    R.layout.base, null);
            layout.attachToActivity(this);
            setContentView(R.layout.activity_find_psw);
            //获取从登录界面和设置界面传递过来的数据
            from = getIntent().getStringExtra("from");
            init();
        }
        /**
         * 获取界面控件及处理相应控件的点击事件
         */
        private void init() {
            tv_main_title = (TextView) findViewById(R.id.tv_main_title);
            tv_back = (TextView) findViewById(R.id.tv_back);
            tv_back.setVisibility(View.VISIBLE);
            rl_title_bar = (RelativeLayout) findViewById(R.id.title_bar);
            rl_title_bar.setBackgroundColor(getResources().getColor(R.color.
                    rdTextColorPress));
            et_validate_name = (EditText) findViewById(R.id.et_validate_name);
            btn_validate = (Button) findViewById(R.id.btn_validate);
            tv_reset_psw = (TextView) findViewById(R.id.tv_reset_psw);
            et_user_name = (EditText) findViewById(R.id.et_user_name);
            tv_user_name = (TextView) findViewById(R.id.tv_user_name);
            if ("security".equals(from)) {
                tv_main_title.setText("设置密保");
            } else {
                tv_main_title.setText("找回密码");
                tv_user_name.setVisibility(View.VISIBLE);
                et_user_name.setVisibility(View.VISIBLE);
            }
            tv_back.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    FindPswActivity.this.finish();
                }
            });
            btn_validate.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String validateName = et_validate_name.getText().toString().trim();
                    if ("security".equals(from)) {   //设置密保
                        if (TextUtils.isEmpty(validateName)) {
                            Toast.makeText(FindPswActivity.this, "请输入要验证的姓名",
                                    Toast.LENGTH_SHORT).show();
                            return;
                        } else {
                            Toast.makeText(FindPswActivity.this, "密保设置成功",
                                    Toast.LENGTH_SHORT).show();
                            //保存密保到SharedPreferences中
                            saveSecurity(validateName);
                            FindPswActivity.this.finish();
                        }
                    } else {//找回密码
                        String userName = et_user_name.getText().toString().trim();
                        String sp_security = readSecurity(userName);
                        if (TextUtils.isEmpty(userName)) {
                            Toast.makeText(FindPswActivity.this, "请输入您的用户名",
                                    Toast.LENGTH_SHORT).show();
                            return;
                        } else if (!isExistUserName(userName)) {
                            Toast.makeText(FindPswActivity.this, "您输入的用户名不存在",
                                    Toast.LENGTH_SHORT).show();
                            return;
                        } else if (TextUtils.isEmpty(validateName)) {
                            Toast.makeText(FindPswActivity.this, "请输入要验证的姓名",
                                    Toast.LENGTH_SHORT).show();
                            return;
                        }
                        if (!validateName.equals(sp_security)) {
                            Toast.makeText(FindPswActivity.this, "输入的密保不正确",
                                    Toast.LENGTH_SHORT).show();
                            return;
                        } else {
                            //输入的密保正确,重新给用户设置一个密码
                            tv_reset_psw.setVisibility(View.VISIBLE);
                            tv_reset_psw.setText("初始密码:123456");
                            savePsw(userName);
                        }
                    }
                }
            });
        }
        /**
         * 保存初始化的密码
         */
        private void savePsw(String userName) {
            String md5Psw = MD5Utils.md5("123456");        //把密码用Md5加密
            SharedPreferences sp = getSharedPreferences("loginInfo", MODE_PRIVATE);
            SharedPreferences.Editor editor = sp.edit(); //获取编辑器
            editor.putString(userName, md5Psw);
            editor.commit();                                  //提交修改
        }
        /**
         * 保存密保到SharedPreferences中
         */
        private void saveSecurity(String validateName) {
            SharedPreferences sp = getSharedPreferences("loginInfo", MODE_PRIVATE);
            SharedPreferences.Editor editor = sp.edit();//获取编辑器
            editor.putString(UtilsHelper.readLoginUserName(this) + "_security",
                    validateName);             //存入用户对应的密保
            editor.commit();          //提交修改
        }
        /**
         * 从SharedPreferences中读取密保
         */
        private String readSecurity(String userName) {
            SharedPreferences sp = getSharedPreferences("loginInfo", Context.MODE_PRIVATE);
            String security = sp.getString(userName + "_security", "");
            return security;
        }
        /**
         * 从SharedPreferences中根据用户输入的用户名来判断是否有此用户
         */
        private boolean isExistUserName(String userName) {
            boolean hasUserName = false;
            SharedPreferences sp = getSharedPreferences("loginInfo", MODE_PRIVATE);
            String spPsw = sp.getString(userName, "");
            if (!TextUtils.isEmpty(spPsw)) {
                hasUserName = true;
            }
            return hasUserName;
        }
    }
    

    (4)修改清单文件。由于“设置密保”界面向右滑动会关闭该界面,因此需要给该界面天透明主题的样式。

            <activity
                android:name=".activity.FindPswActivity"
                android:theme="@style/AppTheme.TransparentActivity" />
    

    (5)“修改登录”界面。由于点击登录界面上的“忘记密码”文字会跳转到“找回密码”界面,因此在LoginActivity.java中找到onClick()方法,在该方法中的“case R.id.tv_forget_psw:”语句下方添加如下代码:

     case R.id.tv_forget_psw:
         Intent forget=new Intent(LoginActivity.this,FindPswActivity.class);
         startActivity(forget);
         break;
    

    (6)“修改设置”界面逻辑代码。由于点击“设置”界面上的“设置密保”条目会跳转到“设置密保”界面,因此需要找到SettingActivity的init()方法,在该方法中的注释“//跳转到设置密保界面”语句下方添加如下代码:

            //设置密保的点击事件
            rl_security_setting.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //跳转到设置密保界面
                    Intent intent = new Intent(SettingActivity.this, FindPswActivity.class);
                    intent.putExtra("from", "security");
                    startActivity(intent);
                }
            });
    

    相关文章

      网友评论

        本文标题:27. 设置模块(四)之设置密保

        本文链接:https://www.haomeiwen.com/subject/nzhhcqtx.html