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

Mic*_*ick 3 android preferenceactivity sharedpreferences edittextpreference

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

我已验证 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;
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助!-迈克尔

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

Mic*_*ick 5

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

  • 我使用了一个SharedPreferences.OnSharedPreferenceChangeListener而不是一个Preference.OnPreferenceChangeListener。在Preference.OnPreferenceChangeListener外观,当用户更改通过设置菜单的偏好,并在更改前的行为致力于偏好数据。在SharedPreferences.OnSharedPreferenceChangeListener更改实际偏好数据监听,而不是改变了图形用户界面,所以它发生稍晚。我注意到在我的第一次尝试中,我可以setText()立即getText()在我的EditTextPreference对象上运行,然后该getText()值与我刚刚设置的setText()值不匹配。我不确定为什么会发生这种情况,但是在尝试运行之前等待更改实际提交会setText()导致正确的响应。也许这是一个时间问题?

  • 我运行setPreferenceScreen(null)addPreferencesFromResource(R.xml.settings)在更新EditTextPreference. 如果我不这样做,有时当用户EditTextPreference再次单击时,即使设置文件中的值不是,该字段中的值也会显示为空白。这会强制设置页面或多或少地自行刷新。

工作代码如下:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)