我正在尝试阻止用户将空字符串输入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中的值无法正确更新,并且应用程序的共享首选项中的值无法正确更新。它保持空白。
答案 0 :(得分:4)
最后通过执行以下操作找到了解决方案:
我使用的是SharedPreferences.OnSharedPreferenceChangeListener
而不是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);
}
}
时,即使设置文件中的值不是,该字段中的值也会显示为空白。这会强制设置页面或多或少地刷新自己。
工作代码如下:
{{1}}