android中apk中的信息保存主要有四种方式,SharedPreferences、File(Properties)、Network、SQLite
SharedPreferences:保存apk中的一些配置信息或者用户信息,采用键值对方式保存,保存的数据类型只能是一些基本数据类型(int、string、boolean..)
今天的demo就是利用SharedPreferences保存历史用户的基本信息,在登录界面内,将历史用户信息绑定在AutoCompleteTextView中,实现google搜索条的自动提示功能。
第一步:打开登录界面,加载所有历史用户信息,每一个用户信息用UserInfo对象保存
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
private String name = "" ;
private String pwd = "" ;
private boolean isRemember = false ;
public String getName() {
return name;
}
public void setName(String name) {
this .name = name;
}
。。。。。
}
开始的时候想让Properties保存List<UserInfo>对象,但是Properties好像也只能保存一些基本数据类型,所以没办法退而求其次,将所有的用户信息保存到String中,格式为:name1/pwd1/isRemember1,name2/pwd2/isRemember2,name3/pwd3/isRemember3。保存方式确定下来后就可以加载资源了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
String userinfos = settings.getString(PREF_USERINFO, "" ); // 获得用户字串
if (userinfos != "" ){
usernames = new ArrayList < String > (); // AutoCompleteTextView的数据源
List < UserInfo > li = new ArrayList < UserInfo > (); // 用于保存用户列表信息
if (userinfos.contains( " , " )){
String[] users = userinfos.split( " , " );
for (String str : users){
UserInfo u = new UserInfo();
String[] user = str.split( " / " );
u.name = user[ 0 ];
u.pwd = user[ 1 ];
u.isRemember = Boolean.parseBoolean(user[ 2 ]);
usernames.add(user[ 0 ]);
li.add(u);
}
} else {
UserInfo u = new UserInfo();
String[] user = userinfos.split( " / " );
u.name = user[ 0 ];
u.pwd = user[ 1 ];
u.isRemember = Boolean.parseBoolean(user[ 2 ]);
usernames.add(user[ 0 ]);
li.add(u);
}
return li;
} else {
return null ;
}
第二步:配置AutoCompleteTextView数据源,也就是上面得到的List<String> usernames;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
actname.setAdapter(adapter);
actname.setOnItemClickListener( this );//列表选定事件,加载用户密码和是否记住
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
public void onItemClick(AdapterView <?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
Log.v(tag, " -----------item selected " );
String name = this .actname.getText().toString().trim();
for (UserInfo user : list){//循环用户信息列表,根据用户名找到对应的详细用户信息
if (user.getName().equals(name)){
String pwd = user.getPwd();
boolean bl = user.isRemember();
etpwd.setText(pwd);
ckremember.setChecked(bl);
return ;
}
}
}
第三步:保存用户信息
先检查是否存在相同用户信息,更新用户列表(list)信息
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
public void checkUser(){
String uname = actname.getText().toString().trim();
String pwd = etpwd.getText().toString().trim();
boolean bl = ckremember.isChecked();
int position = 0 ;
for ( int i = 0 ;i < list.size();i ++ ){
if (list.get(i).getName().equals(uname)){
position = i;
break ;
}
}
if (position >= 0 ){ // 已存在
list.remove(position);
}
UserInfo u = new UserInfo();
u.setName(uname);
u.setPwd(pwd);
u.setRemember(bl);
list.add(u);
}
将最终用户信息一条一条保存
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
private void saveUserInfo(){
checkUser();//检查是否已存在相同用户信息
SharedPreferences settings = this .getPreferences(Activity.MODE_PRIVATE);
String userinfos = "" ;
for (UserInfo user : list){//最终保存的用户信息都在list中
String uname = user.getName();
String pwd = user.getPwd();
String userinfo = uname + " / " + pwd;
if (user.isRemember()){
userinfo += " /true " ;
} else {
userinfo += " /false " ;
}
if (userinfos == "" ){
userinfos = userinfo;
} else {
userinfos += " , " + userinfo;
}
}
Editor editor = settings.edit(); // 编辑器记录
editor.putString(PREF_USERINFO, userinfos);
editor.commit(); // 编辑器提交保存
}