我有我的MainActivity,它调用我的设置Activity:
Intent i = new Intent(this, SettingsActivity.class);
startActivityForResult(i, RESULT_SETTINGS);
"device_name"是一个EditTextPreference,没有默认值或值。
<EditTextPreference
android:key="device_name"
android:title="Device Name"
android:selectAllOnFocus="true"
android:inputType="textCapWords"
android:capitalize="words"
android:singleLine="true"
android:maxLines="1" />
My SettingsActivity扩展PreferenceActivity。
onPostCreate I call bindPreferenceSummaryToValue(findPreference("device_name"));
private static void bindPreferenceSummaryToValue(Preference preference) {
// Set the listener to watch for value changes.
preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
// Trigger the listener immediately with the preference's
// current value.
sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
PreferenceManager
.getDefaultSharedPreferences(preference.getContext())
.getString(preference.getKey(), ""));
}
侦听器的主要焦点是设置首选项摘要,对于editTextPreference,我要检查该值是空还是空,并将其替换为Build.MODEL
。
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object value) {
String stringValue = value.toString();
if (preference instanceof ListPreference) {
// For list preferences, look up the correct display value in
// the preference's 'entries' list.
ListPreference listPreference = (ListPreference) preference;
int index = listPreference.findIndexOfValue(stringValue);
// Set the summary to reflect the new value.
preference.setSummary(
index >= 0
? listPreference.getEntries()[index]
: null);
}
else if (preference instanceof EditTextPreference)
{
EditTextPreference editTextPreference = (EditTextPreference) preference;
//editTextPreference.getText();
if (stringValue.trim().equals("") || stringValue.equals(null))
{
Log.i("valuesUpdate", "Yes");
editTextPreference.setText(Build.MODEL + "_1");
Log.i("valuesUpdate", editTextPreference.getTitle() + " = " + editTextPreference.getText());
editTextPreference.setSummary(Build.MODEL + "_2");
}
else
{
Log.i("valuesUpdate", "No?");
editTextPreference.setSummary(stringValue);
}
}
else {
// For all other preferences, set the summary to the value's
// simple string representation.
preference.setSummary(stringValue);
}
return true;
}
};
当我去获取设置从我的MainActivity,我使用以下代码:
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainActivity.getAppContext());
String android_id = sharedPreferences.getString("device_name", "UNKNOWN_DEVICE");
当我第一次启动应用程序时,android_id如预期返回"UNKNOWN_DEVICE"。
打开/关闭SettingsActivity后,android_id按预期返回"XT1060_1"。
如果我点击编辑设置"device_name",它也会在文本字段中填充"XT1060_1"。
问题:当我编辑设置"device_name"为空字符串,并在我的设备上单击"OK"时,"设备名称"的摘要如预期显示"XT1060_2",日志显示:
valuesUpdate﹕ Yes
valuesUpdate﹕ Device Name = XT1060_1
(所以getText()在SettingsActivity直接在setText())
中工作得很好但是当我重新打开"device_name"的设置时,文本字段仍然为空。
同样,一旦我关闭SettingsActivity并尝试从MainActivity获取设置,android_id也返回一个空字符串。
一旦我重新打开SettingsActivity,它确实工作(就像上面的第2点)。
onPref erenceChangedListener
的onPreferenceChange
方法在SharedPreferences
的状态变化之前被调用。所以。
- onPreferenceChange(带空字符串)
- 你设置新的文本在EditTextPreference(这里我认为onPreferenceChange应该递归地调用,但它似乎不被称为
- 则使用空字符串的更改从1)点应用,即保存空字符串。
我认为你可以返回false在你修改偏好值以防止用空字符串覆盖你的默认值的情况下。
if (stringValue.trim().equals("") || stringValue.equals(null))
{
Log.i("valuesUpdate", "Yes");
editTextPreference.setText(Build.MODEL + "_1");
Log.i("valuesUpdate", editTextPreference.getTitle() + " = " + editTextPreference.getText());
editTextPreference.setSummary(Build.MODEL + "_2");
// HERE
return false;
}