gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:25:43 24 4
gpt4 key购买 nike

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

我已验证 if 语句按预期执行,并且跟踪旧名称 (oldCatName) 的参数按预期更新。我什至可以在 setOnPreferenceChangeListener 完成执行之前记录 catName.getText() 值,我总是看到我期望的值(用户设置的新值,以及何时他们输入一个空白值,它会正确地重置为旧值)。我不确定为什么将值设置为 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 的字符串值甚至可以正确更新。但是,如果用户再次点击 EditTextPreference,则 GUI 中的值不会正确更新,应用共享首选项中的值也不会正确更新。它保持空白。

最佳答案

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

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

  • 更新 EditTextPreference 中的值后,我运行 setPreferenceScreen(null)addPreferencesFromResource(R.xml.settings)。如果我不这样做,有时当用户再次单击 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);
}
}

关于android - EditTextPreference.setText(value) 未按预期更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20592659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com