1

PreferenceScreen如果系统无法自动检测到它,我有一个用户可以输入设备的电话号码。我仍在学习 Android 的这一部分,但PreferenceScreen通过 Android SDK 本身提供的示例和一些教程,我设法理解了一些 s。

我想要的是用户只能在 null 或有效时保存电话号码,其中“有效”是指运行通用验证逻辑(即返回 true 或 false 的匿名方法,可以在任何可能的情况下重用*) 或更好,只是为了简化事情,^(\+39)?3[0-9]{9}$

现在我有以下 XML 片段

<EditTextPreference
    android:inputType="phone"
    android:key="@string/preference_phoneNo"
    android:selectAllOnFocus="true"
    android:singleLine="true"
    android:summary="@string/pref_phoneNumber_description"
    android:title="@string/pref_phoneNumber" />

并由 EclipseNew Activity向导提供以下代码:

private void setupSimplePreferencesScreen() {
    if (!isSimplePreferences(this)) {
        return;
    }

    addPreferencesFromResource(R.xml.pref_general);
    bindPreferenceSummaryToValue(findPreference(getString(R.string.preference_phoneNo)));

}

addPreferenceFromResource应该加载 XML 节点并将首选项添加到屏幕,而应该binPreferenceSummaryToValue在首选项更新时更改描述文本。只是为了那些不喜欢 IDE 代码的人的完整性,第二种方法由 Eclipse 提供,它还在代码文件中提供了一个私有类,即

     /**
 * A preference value change listener that updates the preference's summary
 * to reflect its new value.
 */

在一般情况下,当我在首选项编辑器上单击“确定”时,在保存首选项之前我应该​​如何执行验证逻辑?验证逻辑放在哪里PreferenceScreen

*我们不都是来学习的吗?

4

1 回答 1

4

Android 有一个内置的帮助方法。

String phoneNumber = ...;
boolean valid = PhoneNumberUtils.isGlobalPhoneNumber(phoneNumber);

对于通用的、可重用的方法,这里是PhoneNumberUtils中该方法的实现,由 AOSP(Apache 许可)提供

 private static final Pattern GLOBAL_PHONE_NUMBER_PATTERN =
         Pattern.compile("[\\+]?[0-9.-]+");
 ...
 public static boolean isGlobalPhoneNumber(String phoneNumber) {
     if (TextUtils.isEmpty(phoneNumber)) {
         return false;
     }

     Matcher match = GLOBAL_PHONE_NUMBER_PATTERN.matcher(phoneNumber);
     return match.matches();
 }

Validation should occur within a Preference.OnPreferenceChangeListener , in the onPreferenceChange method. Simply return false if you don't want the value to be saved.

Example snippet:

private static Preference.OnPreferenceChangeListener myListener =
    new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object value) {
            String stringValue = value.toString();
            if (preference instanceof PhoneNumberPreference) {
                return isGlobalPhoneNumber(value);
            }
        }
        ...

As a note, since you're starting off with the Settings activity generated by the Eclipse wizard, this listener has already been built for you. You just need to edit it to include validation of the phone number (assuming that's what's being edited), and to return false if the number is invalid, so it won't be saved to preferences.

于 2012-12-06T21:19:32.847 回答