一个App,登陆界面是少不了的,因为我这个项目对登陆的要求不是很高,所以最初我就是用一个数据库做的。后来发现网上别人都是用sharedpreferences做的。然后我就把两者结合在一起做了一个,其实都是保存数据。不多说,直接上图,看效果。(一些隐私显示信息我已经删掉,就是裸的登陆界面)
如果上一次登陆是记住密码,那么下次登陆就是记住上次登陆的用户名和密码,类似扣扣的登陆设计。
如果你是管理员,你可以添加新用户,如果添加的用户是已经存在的用户,就认为是修改密码。
这里可以显示出已存在的用户索引。
界面的设计主要用到的是Tab,把登陆界面和添加用户、修改密码分开。其他的控件都很简单。
//标签
TabHost tabHost = (TabHost) findViewById(R.id.mytab);
// 如果不是继承TabActivity,则必须在得到tabHost之后,添加标签之前调用tabHost.setup()
tabHost.setup();
// 这里content的设置采用了布局文件中的view
tabHost.addTab(tabHost.newTabSpec("tab1")
.setIndicator("用户登录").setContent(R.id.tab1));
tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("用户管理")
.setContent(R.id.tab2));
数据库的列只有两条,用户名和密码,当然还有唯一的key:id。创建数据库,向数据库里面插入,修改记录和查询数据库记录,这些在前面的文章中都多次说到了,这里不再说。可以参考以前博文。http://blog.csdn.net/jishucai/article/details/24287841
思路是,在管理员界面把用户的信息添加到数据库。如果用户信息已经存在,就表示他的操作是修改密码,也就是对数据库的记录进行修改,改成新密码。而登陆界面的判断就是对数据库的查询,如果能找到记录,且密码和数据库中一致,则通过验证,否则提示各种错误,比方说信息不完整、用户不存在,密码错误等。
还要实现的功能是,如果这次选择记住了密码,下次登陆就会直接记住密码和用户名,用户可以直接点登陆就可以了。
我这里是用sharedpreferences做的,因为不想每次都向数据库插入两条记录,再次打开程序又重新读那两条记录,所以我去查资料,发现原来大家的登陆都是用这个做的,基本没有用数据库的,不过不想改,所以我把两者结合做了,用户信息放在数据库,而最近一次的用户登陆和是否记住密码这个checkbox信息放在了这个xml文件中。
这个sharedpreferences用起来很简单,类似于bundle,有很多文章都说了,我这里简单的说,就是你首先创建一个用来存的文件,getSharedPreferences(),他的参数两个,第一个是你要存的文件名,第二个是你存的形式,一般是MODE_PRIVATE;然后向这个文件写内容,edit().putInt(),这是int型数据,字符型就是putString();最后就是你要用到这个文件的时候,获取就可以了,getString();这里的参数都是两个,第一个都是你定义的key,他是根据你的key来写入和读出的,第二个肯定就是value,就是这个key对应的值。
还要实现用户输入一个字符(可以是汉字),就可以把数据库中符合这样开头的用户名列出来,用户可以直接选择。
这个使用AutocompleteTextView做的,他也是EditText的一种。可以设置他从第几个字符开始显示记录,我这里是第一个,然后就是设置对这个的监听事件。这个改变监听事件有三个方法:beforeTextChanged(),onTextChanged(),afterTextChanged()。从名字可以知道是做什么的。这里用到的是第二个和第三个方法。在第二个方法中,我们从sharedpreferences中把所有符合的记录显示出来;在第三个方法中,我们是判断上一次是否记住了密码,如果记住了,我们这次是直接查询数据库,把用户的密码显示出来,不用用户手动输入。
//AutoCompleteTextView设置
sp_passwd = this.getSharedPreferences("password", MODE_PRIVATE);
sp_cb = this.getSharedPreferences("checkbox", MODE_PRIVATE);
username = (AutoCompleteTextView)findViewById(R.id.username);
username.setThreshold(1);
passwd = (EditText)findViewById(R.id.password);
passwdCB = (CheckBox)findViewById(R.id.checkBox_save);
//显示最近一次输入,如果记住密码就直接全部显示出来
username.setText(sp_cb.getString("USERNAME", ""));
if(sp_cb.getInt("CHECKBOX", 0)==0){
passwdCB.setChecked(false);
}else{
passwdCB.setChecked(true);
passwd.setText(sp_cb.getString("PASSWD", ""));
}
username.addTextChangedListener(new TextWatcher(){
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
if(sp_cb.getInt("CHECKBOX", 0)==1){
//查询数据库记录
String user = username.getText().toString();
Cursor cur = sqlitedb.rawQuery("SELECT * FROM "+SQLite.TABLE_NAME+" WHERE name='"+user+"'", null);
String temp = "";
while(cur.moveToNext()){
temp += cur.getString(2); //2代表数据列的第三列,即password
}
passwd.setText(temp);
}else{
passwd.setText("");
}
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
user = new String[sp_passwd.getAll().size()];// sp.getAll().size()返回的是有多少个键值对
user = sp_passwd.getAll().keySet().toArray(new String[0]);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_dropdown_item_1line,user);
username.setAdapter(adapter);
//查询数据库记录
/*Cursor cur = sqlitedb.rawQuery("SELECT * FROM "+SQLite.TABLE_NAME, null);
int i = 0;
while(cur.moveToNext()){
user[i++] = cur.getString(1);//1代表数据列的第二列,即username
}
//String[] user =new String[]{"chz","chzz","chzzz","1",""};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_dropdown_item_1line,user);
username.setAdapter(adapter);*/
}});
这就是整个的核心。嗯,登陆按键的响应就是查询数据库,看用户名和密码是否和数据库中一致。保存按键的响应就是向数据库中写入记录,也向sharedpreferences中写入,但是不写入密码,只写入用户名,供索引用。退出和登陆都会向sharedpreferences写入checkbox和最近一次用户名的信息,供下次登陆使用。
我省去了数据库的代码。这里是全部代码。
http://download.csdn.net/download/u012321815/7370705