如何检查 PreferenceActivity 中的输入并防止存储无效值?

亚历山大·法伯

我为我的问题准备了一个完整而简单的测试用例:GitHub 上的 ValidatePrefs 应用程序

应用截图

当您单击右上角的“设置”图标时,会显示SettingsActivity

我想EditTextPreference通过返回truefalseonPreferenceChange方法中验证 3 个字段,但它从未被调用:

public class SettingsActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener {
    private static final String TAG = SettingsActivity.class.getSimpleName();

    public static final String ADDRESS   = "address";
    public static final String USERNAME  = "username";
    public static final String PASSWORD  = "password";

    @Override
    public void onCreate(Bundle savedInstanceBundle) {
        super.onCreate(savedInstanceBundle);
        addPreferencesFromResource(R.xml.settings);
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object value) {    
        if (! (preference instanceof EditTextPreference)) {
            return false;
        }

        EditTextPreference editTextPreference = (EditTextPreference)preference;
        String key = editTextPreference.getKey();
        String text = editTextPreference.getText();

        if (key == null || key.isEmpty() || text == null || text.isEmpty()) {
            return false;
        }

        switch (key) {
            case ADDRESS: {
                try {
                    new URI(text);
                } catch (URISyntaxException ex) {
                    ex.printStackTrace();
                    return false;
                }
                return true;
            }

            case USERNAME: {
                return text.length() > 0;
            }

            case PASSWORD: {
                return text.length() > 0;
            }
        }

        return false;
    }
}

更新:

SettingsActivity添加findPreferencesetOnPreferenceChangeListener调用之后,该方法最终被调用:onPreferenceChange

@Override
public void onCreate(Bundle savedInstanceBundle) {
    super.onCreate(savedInstanceBundle);
    addPreferencesFromResource(R.xml.settings);

    EditTextPreference address = (EditTextPreference) findPreference(ADDRESS);
    EditTextPreference username = (EditTextPreference) findPreference(USERNAME);
    EditTextPreference password = (EditTextPreference) findPreference(PASSWORD);

    address.setOnPreferenceChangeListener(this);
    username.setOnPreferenceChangeListener(this);
    password.setOnPreferenceChangeListener(this);
}

但是我仍然无法验证和防止保存错误的数据,因为该text变量包含值。

您可以在下面的调试器屏幕截图中看到它 - 我输入了一个空字符串的新(无效)值,但该变量text仍然包含user1

调试器

更新 2:

好的,我错误地检查了存储在 中的旧值Preference,我应该查看作为第二个参数传递给onPreferenceChange方法的新值这里是我SettingsActivity 中方法的固定版本

@Override
public boolean onPreferenceChange(Preference preference, Object obj) {
    if (!(preference instanceof EditTextPreference && obj instanceof String)) {
        return false;
    }

    EditTextPreference editTextPreference = (EditTextPreference)preference;
    String key = editTextPreference.getKey();
    String oldValue = editTextPreference.getText();
    String newValue = String.valueOf(obj);

    Log.d(TAG, String.format("key %s, value %s -> %s", key, oldValue, newValue));

    // TODO validate the newValue and return true or false
阿齐兹别克安

然而,该方法从未被调用。

在我看来,您忘记了 register setOnPreferenceChangeListener(),这就是不调用回调的原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何引用或“查找” PreferenceActivity?

来自分类Dev

如何从PreferenceActivity获取SharedPreferences

来自分类Dev

处理PreferenceActivity中的点击

来自分类Dev

如何在PreferenceActivity中添加工具栏

来自分类Dev

如何防止用户输入的错误值存储在变量中?

来自分类Dev

如果用户按下R.id.home或返回按钮,如何丢弃PreferenceActivity中的更改?

来自分类Dev

在PreferenceActivity中启用和禁用选项

来自分类Dev

getActionBar()。setDisplayHomeAsUpEnabled(true); nullpointer在preferenceActivity中

来自分类Dev

setDisplayHomeAsUpEnabled()在PreferenceActivity中不起作用

来自分类Dev

PreferenceActivity中的错误膨胀复选框

来自分类Dev

在PreferenceActivity中更改标题文本颜色

来自分类Dev

当无效时,如何防止AngularJS将表单输入的值从其模型中解除绑定?

来自分类Dev

如果输入的值无效,如何防止用户离开控件?

来自分类Dev

Android:如何从PreferenceActivity / PreferenceFragment外部打开ListPreference对话框?

来自分类Dev

Android:如何从PreferenceActivity / PreferenceFragment外部打开ListPreference对话框?

来自分类Dev

如何从PreferenceActivity创建Android App小部件作为配置活动

来自分类Dev

PreferenceActivity中的isValidFragment“方法不会覆盖其超类的方法”

来自分类Dev

在PreferenceActivity中更改片段的突出显示和标题颜色

来自分类Dev

getActionBar()在PreferenceActivity中返回null(AppCompat-v7 21)

来自分类Dev

Android PreferenceActivity:onSaveInstanceState之后,onCreate方法中的bundle为null

来自分类Dev

C ++如何防止无效输入?

来自分类Dev

如何检查Builder模式类中的无效输入?

来自分类Dev

如何检查Builder模式类中的无效输入?

来自分类Dev

如何存储用户在变量中输入的值?

来自分类Dev

如何始终检查输入

来自分类Dev

如何通过输入值检查数组值?

来自分类Dev

如何检查数组中的值

来自分类Dev

如何检查 Checkbutton 值?

来自分类Dev

如何在PreferenceActivity中正确初始化静态变量

Related 相关文章

  1. 1

    如何引用或“查找” PreferenceActivity?

  2. 2

    如何从PreferenceActivity获取SharedPreferences

  3. 3

    处理PreferenceActivity中的点击

  4. 4

    如何在PreferenceActivity中添加工具栏

  5. 5

    如何防止用户输入的错误值存储在变量中?

  6. 6

    如果用户按下R.id.home或返回按钮,如何丢弃PreferenceActivity中的更改?

  7. 7

    在PreferenceActivity中启用和禁用选项

  8. 8

    getActionBar()。setDisplayHomeAsUpEnabled(true); nullpointer在preferenceActivity中

  9. 9

    setDisplayHomeAsUpEnabled()在PreferenceActivity中不起作用

  10. 10

    PreferenceActivity中的错误膨胀复选框

  11. 11

    在PreferenceActivity中更改标题文本颜色

  12. 12

    当无效时,如何防止AngularJS将表单输入的值从其模型中解除绑定?

  13. 13

    如果输入的值无效,如何防止用户离开控件?

  14. 14

    Android:如何从PreferenceActivity / PreferenceFragment外部打开ListPreference对话框?

  15. 15

    Android:如何从PreferenceActivity / PreferenceFragment外部打开ListPreference对话框?

  16. 16

    如何从PreferenceActivity创建Android App小部件作为配置活动

  17. 17

    PreferenceActivity中的isValidFragment“方法不会覆盖其超类的方法”

  18. 18

    在PreferenceActivity中更改片段的突出显示和标题颜色

  19. 19

    getActionBar()在PreferenceActivity中返回null(AppCompat-v7 21)

  20. 20

    Android PreferenceActivity:onSaveInstanceState之后,onCreate方法中的bundle为null

  21. 21

    C ++如何防止无效输入?

  22. 22

    如何检查Builder模式类中的无效输入?

  23. 23

    如何检查Builder模式类中的无效输入?

  24. 24

    如何存储用户在变量中输入的值?

  25. 25

    如何始终检查输入

  26. 26

    如何通过输入值检查数组值?

  27. 27

    如何检查数组中的值

  28. 28

    如何检查 Checkbutton 值?

  29. 29

    如何在PreferenceActivity中正确初始化静态变量

热门标签

归档