1

システムがPreferenceScreen自動検出できない場合、ユーザーがデバイスの電話番号を入力できるようにしています。私はまだ Android のこの部分を学んでいますがPreferenceScreen、Android SDK 自体といくつかのチュートリアルによって提供される例によって、少し理解することができました。

私が望むのは、ユーザーが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" />

New ActivityEclipseウィザードの厚意による次のコード:

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

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

}

addPreferenceFromResourceはXML ノードをロードして設定を画面に追加することになっbinPreferenceSummaryToValueていますが、設定が更新されたときに説明テキストを変更することになっています。IDE の好意によるコードが気に入らない人のために完全を期すために、2 番目の方法は Eclipse によって提供されます。Eclipse はコード ファイルにプライベート クラスも提供します。

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

一般的に、環境設定エディターで [OK] をクリックしたときに環境設定が保存される前に、検証ロジックを実行するにはどうすればよいですか? 検証ロジックはどこに配置されPreferenceScreenますか?

*私たちは皆、学ぶためにここにいるのではありませんか?

4

1 に答える 1

4

Android には、このためのヘルパー メソッドが組み込まれています。

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

一般的な再利用可能なメソッドについては、AOSP (Apache ライセンス) の厚意により、 PhoneNumberUtilsでのそのメソッドの実装を次に示します。

 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();
 }

検証は、 onPreferenceChange メソッドの Preference.OnPreferenceChangeListener 内で行う必要があります。値を保存したくない場合は、単純に false を返します。

スニペットの例:

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);
            }
        }
        ...

Eclipse ウィザードによって生成された設定アクティビティから開始しているため、このリスナーは既に作成されています。電話番号の検証を含めるように編集するだけで (それが編集されていると仮定して)、番号が無効な場合は false を返すため、設定に保存されません。

于 2012-12-06T21:19:32.847 に答える