为什么 EditTextPreference setText( "string" ) 仅在启动时在内部工作?我正在尝试在用户输入空字符串时设置一个值



我有我的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");

  1. 当我第一次启动应用程序时,android_id如预期返回"UNKNOWN_DEVICE"。

  2. 打开/关闭SettingsActivity后,android_id按预期返回"XT1060_1"。

  3. 如果我点击编辑设置"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 erenceChangedListeneronPreferenceChange方法在SharedPreferences的状态变化之前被调用。所以。

  1. onPreferenceChange(带空字符串)
  2. 你设置新的文本在EditTextPreference(这里我认为onPreferenceChange应该递归地调用,但它似乎不被称为
  3. 则使用空字符串的更改从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; 
            }

相关内容

最新更新