在homeActivity里调用,layout,用到了hint,提示
<pre name="code" class="java"><?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="60dp"
android:text="功能列表"
android:gravity="center"
android:textSize="25sp"
android:background="#00FF00"/>
<com.leo.mobilemanager.ui.FocusTextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="您当前使用的是手机卫士2.0版本,当前最新版本是3.0版本,建议下载!"
android:singleLine="true"
android:textSize="14sp"
android:ellipsize="marquee"/>
<GridView
android:id="@+id/gv_home_nine"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:numColumns="3" >
</GridView>
</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里加入密码属性
取消,调用dismiss需要show的返回值类型,alertdialog。
//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
}
});
}
完善响应,一定要注意,相应时,string类型的数据是在onclick里获得,而不是在重载函数外,匿名内部类里获得,报空
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();
//进入该模块
}