本文内容过sp共享数据存储实现记住账号密码功能
***************************************************************************************************************************
public class MainActivity extends Activity {
private AutoCompleteTextView completeTextView;
private EditText editText;
private SharedPreferences sp;
private CheckBox issaveBox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//此方法在下面有具体的实现
findMyView();
}
//得到数据集合的方法
private List<String> initNameData() {
List<String> list = new ArrayList<String>();
Map<String, ?> map = sp.getAll();
Set<String> set = map.keySet();
//通过foreath遍历
for (String name : set) {
if(!name.equals("name") && !name.equals("pwd") && !name.equals("issave")){
list.add(name);
}
}
return list;
}
private void findMyView() {
completeTextView = (AutoCompleteTextView) findViewById(R.id.text_autocomplete);
editText = (EditText) findViewById(R.id.text_edit);
issaveBox = (CheckBox) findViewById(R.id.checkbox_issave);
//获得共享数据对象,共享数据对象只负责读数据,写数据由editor对象完成
//参数一:保存数据的文件名,不用加后缀,自动会生成usrmsg.xml文件,存在/data/data/包名/shared_prefs目录下
//参数二:私有模式
sp = getSharedPreferences("userInfo", MODE_PRIVATE);
/*此XML文件即为通过SP存入手机内存中的XML文件,数据如下(总共存了两个账号,一个是记住密码的zhangsan,123 另一个是不记住密码的lisi,4567)
* <?xml version=‘1.0‘ encoding=‘utf-8‘ standalone=‘yes‘ ?>
<map>
<boolean name="issave" value="false" />
<string name="zhangsan">123</string>
<string name="pwd">123</string>
<string name="lisi">4567</string>
<string name="name">zhangsan</string>
</map>*/
//读取sp中的数据,设置给控件
//如果用户选择过记住, 加载用户名密码给控件
boolean isSave = sp.getBoolean("issave", false);
issaveBox.setChecked(isSave);
if (isSave) {
String uname = sp.getString("name", "");
completeTextView.setText(uname);
String upwd = sp.getString("pwd", "");
editText.setText(upwd);
}
List<String> usernameList = initNameData();//此方法是得到数据集合,封装在上面
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
usernameList);
completeTextView.setAdapter(adapter);
completeTextView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//这里不能用position来获取数据,因为position当用户输入不同数据的时候筛选对应数据的position是不相同的
//参数二的view是当前被单击的对象,用此对象来获取数据
//因为前面给autoComplete控件设置布局用的是安卓系统自带的布局文件,里面含有的只有一个textView,故:
TextView textView = (TextView) view;
String name = textView.getText().toString();
//获得用户选择的用户名后,通过用户名获得相应的密码并给其控件设置上值,实现记住账号密码功能
//getString方法,参数一是关键字,参数二是当搜寻不到的时候默认值填上
String pwd = sp.getString(name, "");
editText.setText(pwd);
}
});
}
public void login(View view){
String name = completeTextView.getText().toString();
String pwd = editText.getText().toString();
//当点击确定按钮时,需要写入数据,这是写数据由editor对象完成,
if(TextUtils.isEmpty(name) || TextUtils.isEmpty(pwd)){
//判断输入的数据是否为空,为空则稍作提示
Toast.makeText(this, "账户名或密码不能为空", Toast.LENGTH_SHORT).show();
}else {
//当点击确定按钮时,需要写入数据,这是写数据由editor对象完成
Editor editor = sp.edit();
if(issaveBox.isChecked()){
//当用户选择记住账户密码的时候,把选项(记住密码)及帐号密码分开存入sp文件中方便获取
editor.putBoolean("issave", true);
editor.putString("name", name);
editor.putString("pwd", pwd);
}else {
editor.putBoolean("issave", false);
}
//当用户没有选择记住账户密码时,以用户输入的用户名作为键,密码作为值存入sp文件中,方便完成自动文本框
editor.putString(name, pwd);
//当数据存储完后,必须提交,只有提交了数据才能真正的存入到sp文件当中
editor.commit();
}
}
}