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.

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(); } } 

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(); 
  • ¿Cuál es la diferencia entre commit () y apply () en Shared Preference
  • Preferencias compartidas "límite"
  • Predeterminado Preferencias compartidas me dan valores incorrectos en Service
  • Android - ¿Cómo obtengo las preferencias compartidas de otra actividad?
  • ¿Restablecer SharedPreferences?
  • Problema al guardar las preferencias compartidas en Android
  • ¿Puedo cambiar el nombre de archivo de Preferencias?
  • ¿Qué es un reemplazo de MODE_WORLD_READABLE SharedPreferences obsoleto en Android?
  • SharedPreferences strage. getSharedPreferences no funciona
  • Cómo hacer que la aplicación vaya a otra página si no se ejecuta por primera vez
  • ¿Cómo uso las preferencias de los fragmentos con ViewPager?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.