سؤال

باستخدام بسيطة EditTextPreference في نشاط تفضيلاتي:

<EditTextPreference
    android:key="SomeKey"
    android:title="@string/some_title"
    android:summary="..."
    android:numeric="integer"
    android:maxLength="2"
/>

هل هناك طريقة يتم حفظ قيمة التكوين هذه على أنها عدد صحيح؟ يبدو الآن أنه يسمح فقط بإدخال الأرقام ، ولكن لا تزال القيمة محفوظة كسلسلة:

الاتصال:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
int value = preferences.getInt("SomeKey", -1);

يلقيني java.lang.ClassCastException: java.lang.String, ، و:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
String value = preferences.getString("SomeKey", "-1");

يسترجع القيمة بنجاح.

كيف تصنع PreferenceActivity لحفظ القيمة كإجراء عدد صحيح افتراضيًا؟

هل كانت مفيدة؟

المحلول

يمكنك تمديد EditTextPreference:

public class IntEditTextPreference extends EditTextPreference {

    public IntEditTextPreference(Context context) {
        super(context);
    }

    public IntEditTextPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public IntEditTextPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected String getPersistedString(String defaultReturnValue) {
        return String.valueOf(getPersistedInt(-1));
    }

    @Override
    protected boolean persistString(String value) {
        return persistInt(Integer.valueOf(value));
    }
}

سيكون من الأفضل الكتابة فوق أساليب OnsetInitialValue () و setText () ، ولكن بعد ذلك يجب عليك نسخ بعض التعليمات البرمجية من فئة أساسية. الحل أعلاه أبسط ، لكنه صعب للغاية - أساليب "السلسلة" تفعل شيئًا مع INTS. حاول عدم تمديد هذا الفصل أكثر ؛-)

يمكنك استخدامه من XML بواسطة:

<package.name.IntEditTextPreference
    android:key="SomeKey"
    android:title="@string/some_title"
    android:summary="..."
    android:numeric="integer"
    android:maxLength="2"
/>

نصائح أخرى

حتى إذا قمت بتعيين Android: Numeric = "Integer" ، فسيكون تفضيل النص - كما يوحي اسمه. يمكنك بسهولة تحويل قيمة السلسلة إلى int باستخدام integer.valueof (). كما يمكنك الكتابة فوق "تفضيل" لإجراء التحويل تلقائيًا عند الخروج.


أعتقد أن أفضل حل هو كتابة طريقة بسيطة للحصول على هذه القيمة من التفضيلات. شيء مثل:

public static int getSomePref(Context context) {
    SharedPreferences prefs =
        PreferenceManager.getDefaultSharedPreferences(context);
    String value = prefs.getString("SomeKey", null);
    return value == null ? -1 : Integer.valueOf(value);
}

ثم يمكنك استخدامه بسهولة من الكود الخاص بك.

على الرغم من أن إجابة تم قبولها ، أود أن أشارك طريقة واحدة أقصر لتحقيق ذلك:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
int value = Integer.parseInt(preferences.getString("SomeKey", "-1"));

نظرًا لأنك قد قمت بالفعل بتعيين أرقام فقط يمكن إدخالها ، فلن يتم إدخال هذا من خلال أي استثناء. بعد لإكمال إجابتي:

<EditTextPref
    android:key="SomeKey"
    android:title="@string/some_title"
    android:summary="..."
    android:numeric="integer"
    android:maxLength="2" />

كان لي نفس المشكلة. (أردت أن يعطيني مشترك PREFERENCE رقم منفذ قمت بتخزينه في ملف XML تفضيلات باعتباره افتراضيًا).

سيكون تنفيذ جميع أساليب المشاركة في الجهد كبيرًا ، لذا فإن كتابة طريقة مخصصة في الفصل تعود إلى المشاركين ، مثل بروت اقترح سيكون من الأفضل أعتقد.

يمكنك أيضًا استخدام الطريقة الثابتة للأشعة الصحيحة في السطر حيث تحتاجه:

int number = Integer.valueOf(settings.getString("myNumberString", "0"));

أعتقد أن هذا هو أقصر واحد يمكنني التوصل إليه:

int CheckInterval = Integer.parseInt(sharedPreferences.getString("check_frequency","60"));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top