3

我试图阻止用户将空字符串输入EditTextPreference(在示例中catName)。我使用 aOnPreferenceChangeListener来检测何时对 进行更改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;
            }
        });
    }
}

谢谢您的帮助!-迈克尔

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

4

1 回答 1

5

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

  • 我用 aSharedPreferences.OnSharedPreferenceChangeListener而不是 a Preference.OnPreferenceChangeListener。查找用户何时通过Preference.OnPreferenceChangeListener设置菜单更改首选项,并在将更改提交到首选项数据之前执行。侦听实际偏好数据的SharedPreferences.OnSharedPreferenceChangeListener更改,而不是 GUI 中的更改,所以它会稍晚一些。我注意到在我的第一次尝试中,我可以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);
    }
}
于 2013-12-15T18:28:11.463 回答