En obtenant une erreur, la méthode put double n'est pas définie pour ce type d'éditeur sharedPreferences.Eclipse reçoit un correctif rapide pour l'ajouter à l'éditeur, mais quand je le fais, ses erreurs sont toujours données, pourquoi ne puis-je pas mettre double.
Le code:
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
if (TextUtils.isEmpty(editBl.getText().toString())) {
numberOfBl = 0;
} else {
numberOfBl = Integer.parseInt(editBl.getText().toString();
}
if (TextUtils.isEmpty(editSt.getText().toString())) {
tonOfSt = 0;
} else {
tonOfSt = Double.parseDouble(editSt.getText().toString());
}
SharedPreferences prefs = getSharedPreferences(
"SavedTotals", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("savedBl", numberOfBl);
editor.putDouble("savedSt", tonOfSt);
editor.commit();
}
Ceux qui ont suggéré d'utiliser putFloat et getFloat se sont malheureusement très trompés. Lancer un double sur un flotteur peut entraîner
Ceux qui suggèrent un toString et parseString ne se trompent pas, mais c'est une solution inefficace.
La façon correcte de gérer cela est de convertir le double en son équivalent "bits longs bruts" et de le stocker aussi longtemps. Lorsque vous lisez la valeur, reconvertissez en double.
Parce que les deux types de données ont la même taille, vous ne perdez pas de précision et vous ne provoquerez pas de flux {over, under}.
Editor putDouble(final Editor edit, final String key, final double value) {
return edit.putLong(key, Double.doubleToRawLongBits(value));
}
double getDouble(final SharedPreferences prefs, final String key, final double defaultValue) {
return Double.longBitsToDouble(prefs.getLong(key, Double.doubleToLongBits(defaultValue)));
}
Vous pouvez également écrire le getter comme:
double getDouble(final SharedPreferences prefs, final String key, final double defaultValue) {
if ( !prefs.contains(key))
return defaultValue;
return Double.longBitsToDouble(prefs.getLong(key, 0));
}
Méthode d'extension de Kotlin (beaucoup plus jolie que d'utiliser des classes d'utils étranges ou autre)
fun SharedPreferences.Editor.putDouble(key: String, double: Double) =
putLong(key, Java.lang.Double.doubleToRawLongBits(double))
fun SharedPreferences.getDouble(key: String, default: Double) =
Java.lang.Double.longBitsToDouble(getLong(key, Java.lang.Double.doubleToRawLongBits(default)))
Ce que j'ai fait a été de sauvegarder la préférence en tant que chaîne:
getSharedPreferences("PREFERENCE", MODE_PRIVATE).edit().putString("double", "0.01").commit();
puis pour récupérer le double, utilisez simplement Double.parseDouble:
Double.parseDouble(getSharedPreferences("PREFERENCE", MODE_PRIVATE).getString("double", "0.01"));
Vous pouvez toujours implémenter SharedPreferences et encapsuler l'implémentation Android.
package com.company.sharedpreferences;
import Android.content.Context;
import Android.content.SharedPreferences;
import Java.util.Map;
import Java.util.Set;
public class EnhancedSharedPreferences implements SharedPreferences {
public static class NameSpaces {
public static String MY_FUN_NAMESPACE = "MyFunNameSpacePrefs";
}
public static EnhancedSharedPreferences getPreferences(String prefsName) {
return new EnhancedSharedPreferences(SomeSingleton.getInstance().getApplicationContext().getSharedPreferences(prefsName, Context.MODE_PRIVATE));
}
private SharedPreferences _sharedPreferences;
public EnhancedSharedPreferences(SharedPreferences sharedPreferences) {
_sharedPreferences = sharedPreferences;
}
//region Overrides
@Override
public Map<String, ?> getAll() {
return _sharedPreferences.getAll();
}
@Override
public String getString(String key, String defValue) {
return _sharedPreferences.getString(key, defValue);
}
@Override
public Set<String> getStringSet(String key, Set<String> defValues) {
return _sharedPreferences.getStringSet(key, defValues);
}
@Override
public int getInt(String key, int defValue) {
return _sharedPreferences.getInt(key, defValue);
}
@Override
public long getLong(String key, long defValue) {
return _sharedPreferences.getLong(key, defValue);
}
@Override
public float getFloat(String key, float defValue) {
return _sharedPreferences.getFloat(key, defValue);
}
@Override
public boolean getBoolean(String key, boolean defValue) {
return _sharedPreferences.getBoolean(key, defValue);
}
@Override
public boolean contains(String key) {
return _sharedPreferences.contains(key);
}
@Override
public Editor edit() {
return new Editor(_sharedPreferences.edit());
}
@Override
public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
_sharedPreferences.registerOnSharedPreferenceChangeListener(listener);
}
@Override
public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
_sharedPreferences.unregisterOnSharedPreferenceChangeListener(listener);
}
//endregion
//region Extension
public Double getDouble(String key, Double defValue) {
return Double.longBitsToDouble(_sharedPreferences.getLong(key, Double.doubleToRawLongBits(defValue)));
}
//endregion
public static class Editor implements SharedPreferences.Editor {
private SharedPreferences.Editor _editor;
public Editor(SharedPreferences.Editor editor) {
_editor = editor;
}
private Editor ReturnEditor(SharedPreferences.Editor editor) {
if(editor instanceof Editor)
return (Editor)editor;
return new Editor(editor);
}
//region Overrides
@Override
public Editor putString(String key, String value) {
return ReturnEditor(_editor.putString(key, value));
}
@Override
public Editor putStringSet(String key, Set<String> values) {
return ReturnEditor(_editor.putStringSet(key, values));
}
@Override
public Editor putInt(String key, int value) {
return ReturnEditor(_editor.putInt(key, value));
}
@Override
public Editor putLong(String key, long value) {
return ReturnEditor(_editor.putLong(key, value));
}
@Override
public Editor putFloat(String key, float value) {
return ReturnEditor(_editor.putFloat(key, value));
}
@Override
public Editor putBoolean(String key, boolean value) {
return ReturnEditor(_editor.putBoolean(key, value));
}
@Override
public Editor remove(String key) {
return ReturnEditor(_editor.remove(key));
}
@Override
public Editor clear() {
return ReturnEditor(_editor.clear());
}
@Override
public boolean commit() {
return _editor.commit();
}
@Override
public void apply() {
_editor.apply();
}
//endregion
//region Extensions
public Editor putDouble(String key, double value) {
return new Editor(_editor.putLong(key, Double.doubleToRawLongBits(value)));
}
//endregion
}
}
Vérifiez ce Gist https://Gist.github.com/john1jan/b8cb536ca51a0b2aa1da4e81566869c4
J'ai créé une classe Preference Utils qui gérera tous les cas.
Son facile à utiliser
Stockage dans les préférences
PrefUtils.saveToPrefs(getActivity(), PrefKeys.USER_INCOME, income);
Obtention de préférence
Double income = (Double) PrefUtils.getFromPrefs(getActivity(), PrefKeys.USER_INCOME, new Double(10));