SharedPreferences.getBoolean devuelve verdadero cada vez
Hice una clase para manejar cambios importantes de datos como el estado de compra de la aplicación y otras cosas.
Para este objetivo he creado una clase que hace el ajuste y la lectura de los valores. Pero el problema es cuando llamo el método appIsPurchased (), el resultado es verdadero mientras que no ha sido cambiado desde la instalación de la aplicación y su primer lanzamiento inicial.
- La mejor opción para almacenar nombre de usuario y contraseña en la aplicación Android
- SharedPreferences: ¿Es una clase o una interfaz?
- ¿Cómo obtengo las preferencias para trabajar en Android?
- Contexto de la aplicación SharedPreferences vs contexto de la actividad
- Lectura de datos SharedPreferences en Fragment, dentro de FragmentActivity
Este es mi código:
/** * Created by neemasa on 5/29/14. * This class handles more crucial data values within app. */ public class AppCore { private SharedPreferences settings; private String keyPurchase = "app_purchased"; private Context context; public AppCore(Context context){ this.context = context; settings = PreferenceManager.getDefaultSharedPreferences(context); } public void setAppInPurchasedMode(String status){ if (status.equals("successful")){ settings.edit().putBoolean(keyPurchase, true).commit(); }else if (status.equals("failed")){ settings.edit().putBoolean(keyPurchase, false).commit(); } } public boolean appIsPurchased(){ boolean purchased = false; if (settings.getBoolean(keyPurchase,true)){ purchased = true; } return purchased; } }
Pregunta 1: ¿Hay algo mal con mi código? Si hay entonces por qué appIsPurchased () siempre devuelve true?
Pregunta 2: ¿Todos los valores de las preferencias compartidas son true de forma predeterminada?
Mientras tanto, cuando uso esta clase en mi código el brindis "Comprado!" Se ejecuta incluso cuando la aplicación se está ejecutando por primera vez.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AppCore appCore = new AppCore(getApplicationContext()); if (appCore.appIsPurchased()){ Toast.makeText(getApplicationContext(),"Purchased!",Toast.LENGTH_SHORT).show(); }else { Toast.makeText(getApplicationContext(),"Not Purchased!",Toast.LENGTH_SHORT).show(); } }
- ¿Preferencias compartidas? Javax.crypto.BadPaddingException: bloque de pad corrompido sólo en algunos dispositivos
- Alcance de SharedPreferences
- Borrar el archivo SharedPreferences
- Cómo pasar el contexto de la aplicación dentro Singleton y SharedPreferences Clases
- Guardar matrices de cadenas con SharedPreference
- Cómo utilizar SharedPreferences en Android para almacenar, buscar y editar valores
- Array de cadenas en SharedPreferences
- SharedPreferences no se actualiza
Lo encontré, el problema es que estaba pensando
settings.getBoolean(keyPurchase,false)
Devuelve el valor de keyPurchased variable, pero el hecho es que sólo devuelve la variable en sí no su valor, así que arreglé el problema cambiando el método de mi clase a esto:
public boolean appIsPurchased(){ return settings.getBoolean(keyPurchase,false); }
¡En realidad hay un problema en tu código! Es por eso que su siempre mostrando comprado!
if (settings.getBoolean(keyPurchase,true)){ purchased = true; }
En estas líneas si la etiqueta keyComprado si no se utiliza, u están pasando el valor verdadero por defecto así que cuando u llame
if (appCore.appIsPurchased()){
Siempre devuelve un valor verdadero .. La solución es que asegúrese de que los valores de preferencia se establecen antes de llamarlos u .. espero que esto ayuda
Está estableciendo el valor predeterminado en true, por lo tanto, su preferencia compartida no contiene una entrada para key_purchased o setAppInPurchasedMode
nunca se llama o se denomina estado de ingenio con successful
. En el lado menor, su
public boolean appIsPurchased(){ boolean purchased = false; if (settings.getBoolean(keyPurchase,true)){ purchased = true; } return purchased; }
Puede ser implementado como:
public boolean appIsPurchased(){ return settings.getBoolean(keyPurchase, false); }
Acerca de setAppInPurchasedMode
, si estuviera en ti cambiaría la forma en que comparas el status
, de esta manera:
public void setAppInPurchasedMode(String status){ if ("successful".equals(status)){ settings.edit().putBoolean(keyPurchase, true).commit(); } else if ("failed".equals(status)){ settings.edit().putBoolean(keyPurchase, false).commit(); } }
La diferencia es que si el status
es nulo, la forma en que se implementa bloqueará su aplicación con NPE. Con mi implementación obtendrá false, porque "successful" instanceof
null siempre es falsa, y instanceof
es la primera comprobación de equals
Para aquellos que siguen teniendo un problema, recuerde aplicar los cambios a sus preferencias.
private SharedPreferences sharedPreferences ; private SharedPreferences.Editor sharedPreferencesEditor; sharedPreferencesEditor.putBoolean("myVariable", false); sharedPreferencesEditor.apply();
- Declarar una variable global para usar en todas las actividades
- ¿Las aplicaciones que utilizan varios procesos comparten una instancia de Dalvik?