PreferenceScreen
PreferenceScreen可以用来实现设置界面的动态显示。
一:
在set.xml中添加列表显示,set.xml要放在layout目录下,
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:drawSelectorOnTop="false" >
</ListView>
</RelativeLayout>
在settings1.xml中配置布局, settings1 .xml要放在xml目录下,
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<EditTextPreference
android:key="key_ param1 "
android:title="@string/param1">
</ EditTextPreference>
</PreferenceScreen>
在Activity程序中,
首先要继承PreferenceActivity,在onCreate中添加preference的监听方法setOnPerferenceChangeListener(this),然后重写OnPreferenceChangeListener接口的onPreferenceChange(final Preference preference, Object newValue)方法即可。
简略代码如下:
public SetActivity extends PreferenceActivity implements OnPreferenceChangeListener {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.set_baseparams);
addPreferencesFromResource(R.xml.setting_baseparams);
getListView().setItemsCanFocus(true);
EditTextPreference param1 = ( EditTextPreference ) findPreference("key_param1");
param1 .setOnPreferenceChangeListener(this);
} public boolean onPreferenceChange(final Preference preference, Object newValue) {
if(preference.getKey().equals("key_param1")) {
... ....
}
return true; // 当返回true时,该preference的值会改变,否则,其值不会变。
}
}
-----------------------------------------------------------------------------------------------------
二:
当我们需要对参数分类别显示时,就需要用到PreferenceCategory,比如:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:key="key_pc1"
android:title="@string/pc1" >
<EditTextPreference
android:key="key_ param1 "
android:title="@string/param1">
</ EditTextPreference>
<EditTextPreference
android:key="key_ param2 "
android:title="@string/param2">
</ EditTextPreference>
</PreferenceCategory>
<PreferenceCategory
android:key="key_pc2"
android:title="@string/pc2" >
<EditTextPreference
android:key="key_ param3 "
android:title="@string/param3">
</ EditTextPreference>
</PreferenceCategory>
</PreferenceScreen>
-----------------------------------------------------------------------------------------------------
三:
我们可能有这种需求,比如说我们想要把这些参数中的全部和部分参数组合起来以同样的方式显示出来。我们很容易想到,可以利用嵌套PreferenceScreen的方式实现这种效果,当我们在一个PreferenceScreen_0中嵌套两个子PreferenceScreen即PreferenceScreen_1和PreferenceScreen_2。我们进入PreferenceScreen_1,当你点击一个EditTextPreference时,在这个界面中该EditTextPreference 的summary的确变了,但当你返回到PreferenceScreen_0界面时,你会发现,那些组合参数的summary并没有改变。
查看PreferenceScreen的API后,才知道,我们所点击的PreferenceScreen只是弹出的一个Dialog而已,返回时,他也只是把Dialog给dismiss掉了,并没有将根PreferenceScreen的summary修改掉。又因为PreferenceScreen类是final类型的,所以无法重写它的方法来达到我们的效果。
后来,从PreferenceActivity类的onPreferenceTreeClick(final PreferenceScreen screen, final Preference prf) {}方法上找到了思路,这个方法不仅是用来实现嵌套PreferenceScreen的,而且我们还可以利用它来start一个新的Activity。
就是说,当我们点击PreferenceScreen_1时,我们启动一个新的Activity,对它的参数进行处理,当我们返回到PreferenceScreen_0时,将这些参数的值手动取出来,再手动改变PreferenceScreen_0的summary,通过这种简单有效的方式,就实现了我们的目的。
public class SetActivity extends PreferenceActivity {
... ...
protected void onCreate(Bundle savedInstanceState) {
...
initSummary(); // 在这个函数中你就可以取出你想显示的参数,从而改变PreferenceScreen_0的summary了。
...
}
public void onResume() {
...
initSummary(); // 同样的,根据你的实际情况,也可以在onResume()中修改你的PreferenceScreen_0的summary
...
}
public boolean onPreferenceTreeClick(final PreferenceScreen screen, final Preference prf) {
if ("key_param1".equals(prf.getKey())) {
Intent intent = new Intent(this, SetParams1.class);
startActivity(intent);
} else if ("key_param2".equals(prf.getKey())) {
Intent intent = new Intent(this, SetParams2.class);
startActivity(intent);
} else {
}
return true;
}
... ...
}
public SetParams1 extends PreferenceActivity implements OnPreferenceChangeListener {
... ...
public boolean onPreferenceChange(final Preference preference, Object newValue) {
if(preference.getKey().equals("key_param1")) {
... ....
}
return true;
}
... ...
}