Подтвердить что ты не робот

PreferenceActivity: сохранение значения как целого

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

4b9b3361

Ответ 1

Вы можете расширить 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"
/>

Ответ 2

Даже если вы установите 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);
}

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

Ответ 3

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

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" />

Ответ 4

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

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

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

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