今天记录两个小小的功能的实现,方便日后回顾。
所有的代码即便是自己一点点敲出来的,如果一个月两个月不看,也会忘记其具体实现的方法代码。正是因为之前疏于记录,导致有些东西再写的时候总是有卡壳的感觉,因此现在尽量在坚持着将遇到的一些小技巧,小功能的实现记录下来。正所谓“好记性不如烂笔头”。
言归正传。
首先将EditText输入框的背景设置写在这里。其实该背景框可以设置自定义的背景,也可以设置为没有背景框,很简单的一句属性就可以搞定。在相应的xml文件中,设置:
<EditText
<span style="font-size:18px;color:#FF0000;">android:background="@null"</span>
style="@style/PageEditText"
android:layout_weight="3" />
加红加大的那行就是最关键的一行了。SoEasy吧?
其次,我遇到了一个简单的功能需求:APP是单机版的,没有使用数据库,在登陆界面中实现是否记住密码功能,以便下次登陆不需要输入账户名称和密码直接点击登陆按钮登陆即可。
考虑是否记住密码,是用户个人的设置,属于个人偏好设置范围,于是考虑用SharedPreferences实现。
SharedPreferences是使用键值对的方式存储数据的,也就是说当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把相应的值取出来,SharedPreferences支持多种不同的数据类型存储。
SharedPreferences存储数据
要想使用SharedPreferences来存储数据,首先需要获得SharedPreferences对象,Android中主要提供了三种用于得到SharedPreferences对象。
(1)Context类中的getSharedPreferences()方法
该方法接收两个参数,第一个用于指定SharedPreferences文件的名称,如果指定的文件不存在则会创建一个,SharedPreferences文件都是存储在/date/date/<packagename>/shared_prefs/目录下的。第二个参数用于指定操作模式,主要有MODE_PRIVATE,MODE_MULTI_PROCESS两种模式可以选择。MODE_PRIVATE是默认的操作模式,和直接传入0的效果是相同的,表示只有当前应用程序才可以对这个SharedPreferences文件进行读写。MODE_MULTI_PROCESS一般用于会有多个进程中对同一个SharedPreferences文件进行读写的情况。
(2)Activity类中的getPreferences()方法
该方法和(1)相似,只接受一个操作模式参数,该方法会自动将当前活动的类名作为SharedPreferences的文件名。
(3)PreferencesManager类中的getDefultSharedPreferences()方法
该方法是一个静态方法,接收一个Context参数,并自动使用当前应用程序的包文件作为前缀来命名SharedPreferences文件。
得到SharedPreferences对象之后,存储数据分为三个步骤.
1.调用SharedPreferences对象的edi()方法获取SharedPreferences.Editor对象。
2.想SharedPreferences.Editor对象中添加数据,使用putString(),putBoolean()等方法。
3.使用commit()方法将添加的数提交,完成数据存储操作。
SharedPreferences读取数据
从SharedPreferences文件中读取数据更加简单。SharedPreferences对象中提供了一系列的get方法用于对存储的数据进行读取,每一个get方法对应一个SharedPreferences.Editor中的一种put方法。get方法接收两个参数,第一个参数是键,传入存储数据时用用的键就可以得到相应的值了,第二个参数是默认值,即表示当传入的键找不到对应的值时,会以什么样的默认值进行返回。
那,基础知识都写在这里了,下面就是具体代码的实现了,哈哈。。
LoginActivity:
//获取SharedPreferences对象
sp = getPreferences(Context.MODE_PRIVATE);
// 初始化记住密码复选按钮
cbRemember = (CheckBox) findViewById(R.id.cb_remember);
// 如果记住密码复选按钮时选中状态,执行
if (sp.getBoolean("ISCHECKED", false)) {
// 初始化页面时,复选按钮选择为选中状态
cbRemember.setChecked(true);
//将账户名称和密码显示在EditText中
etName.setText(sp.getString("userName", ""));
etPassword.setText(sp.getString("password", ""));
}
//为复选按钮设置事件监听
private void setListeners() {
cbRemember.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (cbRemember.isChecked()) {
sp.edit().putBoolean("ISCHECKED", true).commit();
} else {
sp.edit().putBoolean("ISCHECKED", false).commit();
}
}
});
//为登陆按钮设置事件监听
btnLogin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 判断账户名称和密码是否正确
name = etName.getText().toString();
password = etPassword.getText().toString();
if (name.equals("xinchen")) {
if (password.equals("123")) {
// 账户和密码都正确的情况下,检查记住密码按钮是否选中,如果选中状态,将账户名称和密码存储在SharedPreferences文件中。
if (cbRemember.isChecked()) {
Editor editor = sp.edit();
editor.putString("userName", name);
editor.putString("password", password);
editor.commit();
}
Intent intent = new Intent(LoginActivity.this,
MainActivity.class);
startActivity(intent);
finish();
} else {
etPassword.setText("");
Toast.makeText(LoginActivity.this, "密码错误",
Toast.LENGTH_SHORT).show();
}
} else {
etName.setText("");
Toast.makeText(LoginActivity.this, "账户错误",
Toast.LENGTH_SHORT).show();
}
}
});