Android开发 EditTextPreference 和 ListPreference的summary值动态修改

来源:互联网 发布:2017春晚 知乎 编辑:程序博客网 时间:2024/05/16 05:10
有的时候需要在编辑了EditTextPreference或者修改了ListPreferenceListPreference的时候动态的来改变他们的summary值。

下面给出我采用的一种解决方案,这种方案的有点是你只需要在xml里面设置好summary的模板就行,而不去去java代码里面动态的组成summary字符串。

这样的优点是修改summary样式方便,同时也容易做到多语言支持。


代码写的紧凑,三个类都在一个文件里面了。

SettingActivity.java

package com.ynsoft.commontooling;import android.app.Activity;import android.os.Bundle;import android.preference.EditTextPreference;import android.preference.ListPreference;import android.preference.Preference;import android.preference.Preference.OnPreferenceChangeListener;import android.preference.PreferenceFragment;import android.util.Log;public class SettingActivity extends Activity {public static class SettingFragment extends PreferenceFragment {public class PrefListener implements OnPreferenceChangeListener {private String format = null;public PrefListener(String key) {super();Preference preference = findPreference(key);format = preference.getSummary().toString();if (EditTextPreference.class.isInstance(preference)) {// EditTextEditTextPreference etp = (EditTextPreference) preference;onPreferenceChange(preference, etp.getText());} else if (ListPreference.class.isInstance(preference)) {// ListListPreference lp = (ListPreference) preference;onPreferenceChange(preference, lp.getValue());} else {Log.e("SettingActivity", "不支持的Preference类型");}preference.setOnPreferenceChangeListener(this);}@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {preference.setSummary(format.replace("{v}", newValue==null?"null":newValue.toString()));return true;}}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.addPreferencesFromResource(R.xml.testpreferences);// 下面做两个键值的监听// 文本框的对应EditTextPreference// summary like this:// "当前用户为: {0}"new PrefListener("preference_username");// 列表的对应ListPreference// summary like this:// "当前波特率为: {0}"new PrefListener("preference_baudrate");}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingFragment()).commit();}}

配置文件testpreferences.xml

<?xml version="1.0" encoding="utf-8"?><PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >    <!-- summary里面{v}来表示将被填充的值 -->    <EditTextPreference        android:dialogTitle="请输入用户名"        android:key="preference_username"        android:summary="当前用户为: {v}"        android:title="用户名" />    <ListPreference        android:dialogTitle="请选择波特率"        android:entries="@array/baudrate"        android:entryValues="@array/baudrate"        android:key="preference_baudrate"        android:summary="当前波特率为: {v}bps"        android:title="波特率" /></PreferenceScreen>

这样在xml的summary上只需要使用{v}来占位就行,程序会自动将{v}替换为真正的值。

需要注意的是需要在SettingFragment的onCreate里面创建对应的键监听,如下:

new PrefListener("preference_username");





原创粉丝点击