如何验证在Android 2.1中输入的EditTextPreference的格式和值?

12

有没有示例代码可以验证用户在首选项中输入的文本?例如,我有一个EditTextPreference供用户输入电子邮件地址。我想验证输入的电子邮件地址格式是否正确,如果格式不正确,则弹出警示对话框。请问有人有这方面的示例代码吗?谢谢!

3个回答

9

实现Preference.OnPreferenceChangeListener接口

boolean onPreferenceChange(Preference preference, Object newValue)

当用户更改了偏好设置时调用。在偏好设置的状态即将更新且状态被持久化之前调用此方法。

如果需要使用新值更新偏好设置的状态,请返回True。

因此,您可以直接返回值验证的结果。

public class Preferences extends PreferenceActivity implements OnSharedPreferenceChangeListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        findPreference("mail_preference_key").setOnPreferenceChangeListener(
            new Preference.OnPreferenceChangeListener() {

            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                return Pattern.matches("mailPattern", (String) newValue);
            }

        });
    }
}

我有以下代码: if(key.equals("update_delay")) { String newvalue = sp.getString(key, null); if(Integer.parseInt(newvalue) < 60) sp.edit().putString("update_delay", "60").commit(); } 下次我点击EditTextPreference时,它仍然显示低值。您知道commit()在这种情况下是否无效吗? - sargas
我不确定,但在提交方法的参考中写道:
  1. 请注意,当两个编辑器同时修改首选项时,最后一个调用提交的人会获胜。
  2. 如果新值成功写入持久存储,则返回true。
第一点:也许是用户编辑器最后一次调用。 第二点:检查提交是否返回true。 希望这可以帮助到您。
- Fede
1
这不是在更改完成后被称为吗?我想@Aaron的答案是正确的。 - iozee

9
您的问题在我尝试做相同事情时是谷歌上的早期搜索结果,因此希望这可以帮助别人。下面是我今天编写的一些示例代码,演示了OnPreferenceChangeListener的使用,从而允许您停止无效更改。
在您的片段中:
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);

        Your_Pref = (EditTextPreference) getPreferenceScreen().findPreference("Your_Pref");

        Your_Pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                Boolean rtnval = true;
                if (Your_Test) {
                    final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                    builder.setTitle("Invalid Input");
                    builder.setMessage("Something's gone wrong...");
                    builder.setPositiveButton(android.R.string.ok, null);
                    builder.show();
                    rtnval = false;
                }
                return rtnval;
            }
        });
    }

2
我会建议您使用 Preference.OnPreferenceChangeListener 而不是 SharedPreferences.OnSharedPreferenceChangeListener
前者允许您在值被持久化之前验证新值(并防止其被持久化),而不是之后。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接