EditTextPreference.setText(value)未按预期更新

时间:2013-12-15 08:29:28

标签: android sharedpreferences preferenceactivity edittextpreference

我正在尝试阻止用户将空字符串输入EditTextPreference(在示例中为catName)。我使用OnPreferenceChangeListener来检测何时对EditTextPreference进行了更改,如果有更改且字符串为空,我使用EditTextPreference.setText()命令重置为旧值。但是,如果我重新打开GUI中的EditTextPreference(字符串为空白),则新值无法正确显示,如果我返回主应用程序,我可以验证是否保存了空白值偏好。

我已经验证了if语句按预期执行,并且跟踪旧名称(oldCatName)的参数正在按预期更新。我甚至可以在catName.getText()完成执行之前记录setOnPreferenceChangeListener值,我总是看到我期望的值(用户设置的新值,当他们输入空白值时,它正确地重置为旧的价值)。我不确定为什么将值设置为EditTextPreference不会将值保存到首选项文件或更新GUI。

public class SettingsActivity extends PreferenceActivity {

    private String oldCatName;
    private EditTextPreference catName;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.settings);

        catName = (EditTextPreference) findPreference("cat_name");
        oldCatName = catName.getText();

        catName.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newVal) {
                final String value = (String) newVal;
                if (value.equals("")) {
                    catName.setText(oldCatName);                
                    Log.e("new value", catName.getText());
                }
                else
                    oldCatName = value;
                return true;
            }
        });
    }
}

感谢您的帮助! -Michael

编辑:澄清。 if语句中的逻辑正确执行。 EditTextPreference的字符串值甚至可以正确更新。但是,如果用户再次点击EditTextPreference,则GUI中的值无法正确更新,并且应用程序的共享首选项中的值无法正确更新。它保持空白。

1 个答案:

答案 0 :(得分:4)

最后通过执行以下操作找到了解决方案:

  • 我使用的是SharedPreferences.OnSharedPreferenceChangeListener而不是Preference.OnPreferenceChangeListenerPreference.OnPreferenceChangeListener查找用户何时通过设置菜单更改首选项,并在将更改提交到首选项数据之前执行操作。 SharedPreferences.OnSharedPreferenceChangeListener侦听实际首选项数据的更改,而不是GUI中的更改,因此稍后会发生更改。我注意到,在我的第一次尝试中,我可以在我的setText()对象上紧跟getText()后跟EditTextPreference运行getText()值与我刚设置的值不匹配setText()值为setText()。我不确定为什么会发生这种情况,但在尝试运行setPreferenceScreen(null)之前等待实际提交的更改会导致正确的响应。也许这是一个时间问题?

  • 我在更新addPreferencesFromResource(R.xml.settings)中的值后运行EditTextPreferenceEditTextPreference。如果我没有这样做,有时当用户再次点击public class SettingsActivity extends PreferenceActivity { private String oldCatName; private EditTextPreference catName; private SharedPreferences.OnSharedPreferenceChangeListener listener; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); createListener(); catName = (EditTextPreference) findPreference("cat_name"); oldCatName = catName.getText(); } private void createListener() { listener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged( SharedPreferences sharedPreferences, String key) { String value = sharedPreferences.getString("cat_name", "NULL"); if (value.equals("")) { catName.setText(oldCatName); setPreferenceScreen(null); addPreferencesFromResource(R.xml.settings); } else { oldCatName = value; } } }; PreferenceManager.getDefaultSharedPreferences(getApplicationContext()) .registerOnSharedPreferenceChangeListener(listener); } } 时,即使设置文件中的值不是,该字段中的值也会显示为空白。这会强制设置页面或多或少地刷新自己。

工作代码如下:

{{1}}