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

时间:2017-04-13 13:12:13

标签: android sharedpreferences android-preferences preferenceactivity android-sharedpreferences

我为我的问题准备了一个完整而简单的测试用例:ValidatePrefs app at GitHub

app screenshots

点击"设置"右上角的图标显示SettingsActivity

我想通过从EditTextPreference方法返回truefalse来验证3个onPreferenceChange字段,但它永远不会被调用:

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仍然包含{{>> 值{{ 1}}:

debugger

更新2:

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

onPreferenceChange

1 个答案:

答案 0 :(得分:1)

  

但是从不调用该方法。

在我看来,你忘了注册setOnPreferenceChangeListener(),这就是没有调用回调的原因。