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 中的值不会正确更新,并且应用程序的共享首选项中的值也不会正确更新。它保持空白。
最终通过执行以下操作找到了解决方案:
我使用了一个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)
| 归档时间: |
|
| 查看次数: |
7677 次 |
| 最近记录: |