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
для сохранения значения как целого по умолчанию?
Ответы
Ответ 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"));