PreferenceActivity: сохранить значение как целое число - PullRequest
49 голосов
/ 16 сентября 2010

Использование простого 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 сохранять значение как целое по умолчанию?

Ответы [ 5 ]

65 голосов
/ 21 сентября 2010

Вы можете расширить 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 (), но тогда вам придется скопировать некоторый код из базового класса. Вышеупомянутое решение проще, но это довольно сложно - «строковые» методы делают что-то с int. Постарайтесь не расширять этот класс дальше; -)

Вы можете использовать его из XML:

<package.name.IntEditTextPreference
    android:key="SomeKey"
    android:title="@string/some_title"
    android:summary="..."
    android:numeric="integer"
    android:maxLength="2"
/>
7 голосов
/ 16 сентября 2010

Даже если вы установите android: numeric = "integer", это будет текстовое предпочтение - как следует из его названия. Вы можете легко преобразовать строковое значение в int, используя Integer.valueOf (). Также вы можете перезаписать PreferenceActivity для автоматического преобразования при выходе.


Я думаю, что лучшее решение - написать простой метод, чтобы получить это значение из предпочтений. Что-то вроде:

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

Тогда вы можете очень легко использовать его из своего кода.

4 голосов
/ 18 января 2016

Несмотря на то, что ответ был оставлен принятым, я хотел бы поделиться еще одним более коротким способом для достижения этой цели:

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" />
1 голос
/ 16 марта 2019

Я думаю, что это самое короткое, что я мог придумать:

int CheckInterval = Integer.parseInt(sharedPreferences.getString("check_frequency","60"));
1 голос
/ 18 января 2016

У меня была такая же проблема. (Я хотел, чтобы SharedPreference дал мне номер порта, который я сохранил в файле настроек XML как defaultValue).

Реализация всех методов SharedPreferences потребовала бы больших усилий, поэтому, на мой взгляд, лучше всего было бы написать собственный метод в классе, который создает экземпляр SharedPreferences, как предложено broot .

Вы также можете просто использовать статический метод Integer в строке, где он вам нужен:

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