我们都知道,一般人身高的变化程度,比起体重的变化程度小的多。
因此就设计一款 BMI 计算程序来说,如果能在使用者第一次输入身高体重值后,程序 能帮我们预先记住上次输入过的身高,那麽等到下次启动程序时,便只需要输入体重。这麽 一来,减少了使用者重複输入的麻烦,在使用上就更方便了。使用者应该会喜欢这个便利的 功能吧。
使用偏好设定
打开"src/com/demo/android/bmi/Bmi.java",在"onCreate"和"onStop"中加入
"Preference"(偏好设定)相关的程序码。完整的程序码如下:
代码::::
ublic class Bmi extends Activity {
private static final String TAG = "Bmi";
public static final String PREF = "BMI_PREF";
public static final String PREF_HEIGHT = "BMI_Height";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) { super.onCreate(icicle);
setContentView(R.layout.main);
findViews();
restorePrefs();
setListensers();
}
// Restore preferences private void restorePrefs() {
SharedPreferences settings = getSharedPreferences(PREF, 0);
String pref_height = settings.getString(PREF_HEIGHT, "");
if(! "".equals(pref_height)) {
field_height.setText(pref_height);
field_weight.requestFocus();
} }
...
@Override
protected void onStop(){
super.onStop();
// Save user preferences. use Editor object to make changes.
SharedPreferences settings = getSharedPreferences(PREF, 0);
settings.edit()
.putString(PREF_HEIGHT, field_height.getText().toString()) .commit();
} 讲解
取得偏好设定 代码::::
// Restore preferences
private void restorePrefs() {
SharedPreferences settings = getSharedPreferences(PREF, 0);
String pref_height = settings.getString(PREF_HEIGHT, "");
if(! "".equals(pref_height)) {
field_height.setText(pref_height);
field_weight.requestFocus();
} }
我们在"onCreate"函式中,加入一行 "restorePrefs"呼叫。并在"onCreate"函式外,再定义 一个"restorePrefs"函式如上。
代码::::
SharedPreferences settings = getSharedPreferences(PREF, 0);
我们宣告了一个偏好设定(SharedPreferences)型别"settings",并使用
"getSharedPreferences"函式,来寻 找系统中有无符合以 "BMI_PREF"字串(PREF 参数)作 为档名的偏好设定档。如果有符合条件的偏好设定档存在的话,就将这个偏好设定指定使用
"settings"作为代号来操作。如果没有的 话,"getSharedPreferences"函式会回传 0 给
"settings"。
代码::::
String pref_height = settings.getString(PREF_HEIGHT, "");
我们可以透过"getXXX"函式,来从偏好设定 (SharedPreferences)读取不同型别的内容。
例如本例中使用"getString"来读取 文字类型的信息。当 "PREF_HEIGHT"偏好设定参数存在 时,字串"pref_height"就会得到偏好设定参数的内容。如果不存 在"PREF_HEIGHT"这个偏 好设定参数时,字串"pref_height"则会得到一个空字串。
代码::::
if(! "".equals(pref_height)) {
pref_height.setText(pref_height);
...
}
当"pref_height"字串存在时,我们将 field_height 栏位内容设定成偏好设定参数中取出 的值。
代码::::
field_weight.requestFocus();
同时,因为身高栏位已经预先填好了,使用者只需要再填入体重值即可开始计算自己的 BMI 值。但是当程序一执行,预设的焦点栏位(游标)还是停在"身高"栏位上。因此我们 可以在"field_weight"栏位识别符号上,使 用"requestFocus"函式,来手动将焦点栏位改到"
体重"栏位上。这样当使用者要输入时,如果之前已经输入过"身高",那麽程序就会自动帮
protected void onStop(){
super.onStop();
// Save user preferences. use Editor object to make changes.
SharedPreferences settings = getSharedPreferences(PREF, 0);
settings.edit()
.putString(PREF_HEIGHT, field_height.getText().toString()) .commit();
}
当我们使用"Home"、"Back"按钮或其他方式离开当前的 Activity 时,我们才把身高的 值储存到偏好设定中。根据上一章活动的生命週期,我们知道离开当前萤幕的最后一个状态 是"Stop"状态。因此我们覆载 (Override)了"onStop"函式,在其中加入储存身高偏好设定的程 序码。"super.onStop"的作用是先将原本的"onStop"函 式执行一遍。
代码::::
SharedPreferences settings = getSharedPreferences(PREF, 0);
我们宣告了一个偏好设定(SharedPreferences)型别"settings",并使用
"getSharedPreferences"函式,来寻 找系统中有无符合以 "BMI_PREF"字串(PREF 参数)作 为档名的偏好设定档。如果有符合条件的偏好设定档存在的话,就将这个偏好设定指定使用
"settings"作为代号来操作。如果没有的 话,"getSharedPreferences"函式会回传 0 给
"settings"。
代码::::
settings.edit()
.putString(PREF_HEIGHT, field_height.getText().toString()) .commit();
在此我们串接了三个 settings 拥有的函式:"edit"、"putString",和"commit"。要改变偏 好设定(SharedPreferences)型别的内容,需要透 过"edit"函式来编辑。编辑结束后,要透过
"commit"函式来将改变写到系统中。我们可以透过"putXXX"函式来为偏好设定
(SharedPreferences)填入不同型别的内容。例如本例中使用"putString"来写入文字类型的信息
(读者也可以试试用 putInt 或 putFloat 函式来直接将身高值储存成整数或浮点数)。
本例中"putString"函式所执行的动作,是透过"field_height"界面元件识别符号来取得身 高的字串后,将字串储存到"PREF_HEIGHT"所代表的偏好设定参数中。