preferencias - sharedpreferences android studio ejemplo
¿Cómo obtengo preferencias para trabajar en Android? (3)
Para la mayoría de las aplicaciones, es más conveniente usar las preferencias compartidas predeterminadas. Puede acceder desde cualquier lugar en su aplicación con:
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
Puedes guardar nuevas variables en él con:
sp.edit().putString("var_name", "var value".apply();
Realmente he estado luchando con esto. Nuevo en Java / Android. Estoy escribiendo mi primera aplicación y esta es la primera cosa que me ha tomado más de un par de días de búsqueda para averiguarlo. Aquí está la configuración: es un contador de calculadora / bebida de BAC:
Una fórmula se usa para calcular el BAC. Aquí está la forumla:
Bac = ((StandardDrinks / 2) * (GenderConstant / Weight)) - (0.017 * Hours);
Como puede ver, ser capaz de modificar el sexo y el peso producirá resultados más precisos y personalizados. Entonces los tengo como dobles:
double GenderConstant = 7.5; //9 for female
double Weight = 180;
Para cambiar estas variables, me gustaría que la persona pueda acceder a la configuración y elegir diferentes valores. Tengo estas cosas configuradas, pero no están vinculadas a las variables que se muestran arriba porque no puedo, por la vida de mí, descubrir cómo. Aquí están:
Presiono el botón de menú y aparece. Estupendo. Haré clic en Configuración.
Ahora las preferencias aparecen. Aquí está mi preferences.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="Personal Settings">
<ListPreference
android:title="Gender"
android:summary="Verify or deny the presence of a Y chromosome."
android:key="genderPref"
android:defaultValue="male"
android:entries="@array/genderArray"
android:entryValues="@array/genderValues" />
<ListPreference
android:title="Weight"
android:summary="How much the planet pulls on you, in pounds."
android:key="weightPref"
android:defaultValue="180"
android:entries="@array/weightArray"
android:entryValues="@array/weightValues" />
</PreferenceCategory>
<PreferenceCategory android:title="Drink Settings">
<ListPreference
android:title="Beer Size"
android:summary="The volume of your beer, in ounces."
android:key="beerPref"
android:defaultValue="12"
android:entries="@array/beerArray"
android:entryValues="@array/beerValues" />
<ListPreference
android:title="Shot Size"
android:summary="The volume of your shot, in ounces."
android:key="shotPref"
android:defaultValue="1.5"
android:entries="@array/shotArray"
android:entryValues="@array/shotValues" />
<ListPreference
android:title="Wine Size"
android:summary="The volume of your wine, in ounces."
android:key="winePref"
android:defaultValue="5"
android:entries="@array/wineArray"
android:entryValues="@array/wineValues" />
</PreferenceCategory>
</PreferenceScreen>
Adelante al peso ListPreference:
Y eso aparece. Los valores se almacenan como matrices de cadenas en res / values / arrays.xml. Aquí hay una muestra, solo de las de peso:
<string-array name="weightArray">
<item>120 lbs</item>
<item>150 lbs</item>
<item>180 lbs</item>
<item>210 lbs</item>
<item>240 lbs</item>
<item>270 lbs</item>
</string-array>
<string-array name="weightValues">
<item>120</item>
<item>150</item>
<item>180</item>
<item>210</item>
<item>240</item>
<item>270</item>
</string-array>
Esto es básicamente todo lo lejos que he llegado. Puedo hacer clic en un valor, claro, pero no cambia la fórmula porque no está vinculado con los dobles que creé en DrinkingBuddy.java. Todas las cosas que se muestran en la configuración son solo cáscaras vacías por ahora, incluido el rotor en el diseño principal (el tiempo predeterminado se establece en 1 hora)
Creé un Preferences.java y he intentado implementar varias combinaciones de código encontradas en tutoriales y recursos en la web, pero fue en vano. Aquí está, de todos modos, lleno de intentos fallidos de hacer que beerPref (la opción de configuración para cambiar cuántas onzas en la cerveza) se correlaciona con una variable en mi clase principal:
package com.dantoth.drinkingbuddy;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.Preference.OnPreferenceClickListener;
public class Preferences extends PreferenceActivity {
public static final String PREF_BEER_SIZE = "PREF_BEER_SIZE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
//Get the custom preference
Preference beerPref = (Preference) findPreference("beerPref");
beerPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
SharedPreferences customSharedPreference = getSharedPreferences("myCustomSharedPrefs", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = customSharedPreference.edit();
editor.commit();
return true;
}}
);}
}
Un tutorial completo y un código de muestra sería IMPRESIONANTE, ya que aún no he encontrado ninguna guía confiable.
Todavía estoy trabajando en esto, pero (algo adaptado de mi versión) creo que tu clase de Preferencias solo necesita hacer lo siguiente:
public class Preferences extends PreferenceActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// load the XML preferences file
addPreferencesFromResource(R.xml.preferences);
}
}
Luego, en tu clase principal, puedes consultar las preferencias:
public class DrinkingBuddy extends Activity
implements OnSharedPreferenceChangeListener {
private int weight;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
// register preference change listener
prefs.registerOnSharedPreferenceChangeListener(this);
// and set remembered preferences
weight = Integer.parseInt((prefs.getString("weightPref", "120")));
// etc
}
// handle updates to preferences
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals("weightValues")) {
weight = Integer.parseInt((prefs.getString("weightPref", "120")));
}
// etc
}
}
El ahorro de actualizaciones de preferencias se maneja para usted.
(¡No estoy muy seguro acerca de las declaraciones públicas / privadas!)
Usted está solicitando probablemente dos conjuntos diferentes de archivos de preferencias.
Asegúrese de almacenar los valores ListPreference en los mismos archivos. Inicie la cd /data/data/com.your.package
archivos en el cd /data/data/com.your.package
y busque carpetas y archivos de tipo preferencias.
Creo que el error es que especifica un archivo diferente al que también se guardó la configuración:
Intenta cambiar esto:
SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);
a
SharedPreferences preferences = PreferenceManager
.getDefaultSharedPreferences(context);
Entonces probablemente solo tendrá que consultar
preferences.getString(''weightPref'', null);
Además , no necesitas el Editor . Las preferencias se guardan automáticamente.