其他分享
首页 > 其他分享> > android-EditTextPreference.setText(value)未按预期更新

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

作者:互联网

我试图防止用户向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.OnPreferenceChangeListener. Preference.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);
    }
}

标签:edittextpreference,preferenceactivity,sharedpreferences,android
来源: https://codeday.me/bug/20191030/1965109.html