在homeActivity里调用,layout,用到了hint,提示
<?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:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="50dp" android:text="设置密码" android:gravity="center" android:background="#00ff00" android:textSize="15sp"/> <EditText android:id="@+id/et_dialog_password" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请输入密码"/> <EditText android:id="@+id/et_dialog_passwordconfirm" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请确认密码"/> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:layout_weight="1" android:layout_height="wrap_content" android:layout_width="0dp" android:id="@+id/bt_ok" android:text="确认"/> <Button android:layout_weight="1" android:layout_height="wrap_content" android:layout_width="0dp" android:id="@+id/bt_cancle" android:text="取消"/> </LinearLayout> </LinearLayout>
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub switch (position) { case 0: //第一次进入的时候,弹出一个对话框,让用户输入密码,两次确认。 showSetPasswordDialog(); break; case 8: //跳入到setting页面 Intent intent = new Intent(HomeActivity.this,SettingActivity.class); startActivity(intent); break; default: break; } } } private void showSetPasswordDialog() { // TODO Auto-generated method stub Builder builder = new Builder(this); View view = View.inflate(this, R.layout.dialog_setpw, null); builder.setView(view); builder.show(); }
输入密码框架确定,完善细节
第二个密码框确认是否密码一致,一致了才进入模块,不一致要求重新输入
在layout里加入密码属性
取消
//builder有三种创建方式,为了能够实现取消,需要有一个builder实体 bt_cancle.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //将dialog dismiss掉 dialog.dismiss(); } });
具体的对比逻辑,首先是判断是否为空,不为空的时候再去对比是否相同,不同就要重新输入
一致需要SharedPreferences保存数据,第一次输入成功后为了加上印象,一般会让用户再登陆一次,需要将前面这个dialogdismiss掉
if (password.equals(passwordconfrim)) { //将密码保存起来 Toast.makeText(HomeActivity.this, "密码输入ok,即将保存", 1).show(); Editor editor =sp.edit(); editor.putString("password", password); editor.commit(); //在确认后一般要求重新登陆一次以方便用户加深记忆,先dismiss当前dialog dialog.dismiss(); }
注意这个dialog的实现,在上面用builder.show,但是需要用alertDialog接收
private void showSetPasswordDialog() { // TODO Auto-generated method stub Builder builder = new Builder(this); View view = View.inflate(this, R.layout.dialog_setpw, null); //在匿名内部类里需要加上final才能被局部变量引用 builder.setView(view); //builder返回一个AlertDialog,显示出来还要接收下 //必须用dialog接收方便后面dismiss掉,正常写法是创建,显示,接收 /*final AlertDialog dialog = builder.create(); builder.show();*/ final AlertDialog dialog = builder.show();
在刚进入的时候也需要判断下,如果已经保存了,则只是需要一次输入的框,第一次登陆,没有保存的,才需要两次输入对比,这里也要实现一个新的方法和layout
switch (position) { case 0: //第一次进入的时候,弹出一个对话框,让用户输入密码,两次确认。 //如果没要保存的需要输入和再次输入 if (sp.getString("password", "").length()==0) { showSetPasswordDialog(); } else { //如果是已经有了,则直接进入单次输入框 showInputPasswordDialog(); } break;
单次输入框的实现
<?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:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="50dp" android:text="输入密码" android:gravity="center" android:background="#00ff00" android:textSize="15sp"/> <EditText android:id="@+id/et_inputdialog_password" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请输入密码" android:inputType="textPassword"/> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:layout_weight="1" android:layout_height="wrap_content" android:layout_width="0dp" android:id="@+id/bt_inputdialog_ok" android:text="确认"/> <Button android:layout_weight="1" android:layout_height="wrap_content" android:layout_width="0dp" android:id="@+id/bt_inputdialog_cancle" android:text="取消"/> </LinearLayout> </LinearLayout>
单输入框框的架子
private void showInputPasswordDialog() { Builder builder = new Builder(this); View view = View.inflate(this, R.layout.dialog_inputpw, null); builder.setView(view); final AlertDialog dialog =builder.show(); final EditText et_password = (EditText) view.findViewById(R.id.et_inputdialog_password); Button bt_ok = (Button) view.findViewById(R.id.bt_inputdialog_ok); Button bt_cancle = (Button) view.findViewById(R.id.bt_inputdialog_cancle); bt_ok.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } }); bt_cancle.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } }); }
完善响应
bt_ok.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String password_saved = sp.getString("password", ""); String password_input = et_password.getText().toString(); if (password_input.length()!=0) { if (password_input.equals(password_saved)) { //密码跟保存的一致,则可以进入该模块 Toast.makeText(HomeActivity.this, "密码正确,即将进入设置模块", 1).show(); dialog.dismiss(); //进入该模块 } else { Toast.makeText(HomeActivity.this, "密码不正确,请重新输入", 1).show(); } } } });
正确后需要进入一个新的layout,这个暂时留在后面,现在需要实现加密,否则手机丢了,直接把文件导出就能看到密码了~
通常我们以MD5加密
在实现MD5加密主要有以下几个步骤
首先得到一个信息摘要器 MessageDigest 然后设置MD5
我们获取要加密的数据 例如 password=“123456”
将这些数据转换成字节数据 password.getBytes()
循环对每个字节数进行处理
这里主要是做2个处理 一个是 对每个字节数据进行 与运算 一般是与上一个16进制的数
例如 int number = p $ 0xff;
然后 将得到的number'进行转换为16进制的数
Integer.toHexString(number);
如果这个数转换后的长度为1 那么我们就补0
不满八个二进制那么我们就补全
在工具包里加入一个MD5的工具
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Utils { public static String getDegist(String password){ String degist = ""; try { MessageDigest md = MessageDigest.getInstance("md5"); byte[] digest =md.digest(password.getBytes()); StringBuffer sb =new StringBuffer(); for (byte b : digest) { int resutl = b& 0xff; String str= Integer.toHexString(resutl); if (str.length()==1) { sb.append("0"); } sb.append(str); } degist =sb.toString(); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } return degist; } }
输入后要解密
if (password.equals(passwordconfrim)) { //将密码保存起来 Toast.makeText(HomeActivity.this, "密码输入ok,即将保存", 1).show(); Editor editor =sp.edit(); //将明文转成密文,password123-》加密 String degist = MD5Utils.getDegist(password); editor.putString("password", degist); editor.commit(); //在确认后一般要求重新登陆一次以方便用户加深记忆,先dismiss当前dialog dialog.dismiss(); }
有保存后,再次输入需要对比,拿到的是密文,我们需要把再次输入的也生成密文再对比
@Override public void onClick(View v) { // TODO Auto-generated method stub String password_saved = sp.getString("password", ""); String password_input = et_password.getText().toString(); if (password_input.length()!=0) { String password_input_digest = MD5Utils.getDegist(password_input); if (password_input_digest.equals(password_saved)) { //密码跟保存的一致,则可以进入该模块 Toast.makeText(HomeActivity.this, "密码正确,即将进入设置模块", 1).show(); dialog.dismiss(); //进入该模块 }