上一节对“我”模块(二)进行了综述(可参见 “我”模块(二) 进行了解),接下来将从设置模块开始详细介绍:
知识点
- 掌握“收藏”界面的开发,能够实现新闻收藏功能。
- 掌握“设置”界面的开发,能够设置用户的基本信息。
- 掌握“修改密码”界面的开发,能够实现密码的修改功能。
- 掌握“设置密保”界面的开发, 能够实现密保的设置功能。
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);
}
});