Error al obtener SharedPreferences

publicado por: Anonymous

Estoy intentado crear una clase para obtener los datos predefinidos, pero cuando llamo el metodo Load() se detiene la app.
¿Me podrian ayudar? Gracias

package com.example.nano.prueba.login.loginprueba;

import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;


/**
 * Created by admin on 02/04/2016.
 */
public class LoadPreferencias extends AppCompatActivity {

    private String User;
    private String Pass;

    public void Load(){

        SharedPreferences Preferencias = getSharedPreferences("DatosUser", Context.MODE_PRIVATE);
        User =(Preferencias.getString("User",""));
        Pass = (Preferencias.getString("Pass", ""));

    }

    public String GetUser()
    {
        Load();
        return User;
    }
    public String GetPass()
    {
        return Pass;
    }



}

agrego codigo de error

04-03 09:55:44.445 31786-31786/? E/AndroidRuntime: FATAL EXCEPTION:
main
Process: com.example.nano.prueba.login.loginprueba, PID: 31786
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.example.nano.prueba.login.loginprueba/com.example.nano.prueba.login.loginprueba.MainActivity}:
java.lang.NullPointerException: Attempt to invoke virtual method
‘android.content.SharedPreferences
android.content.Context.getSharedPreferences(java.lang.String, int)’
on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2658)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723)
at android.app.ActivityThread.access$900(ActivityThread.java:172)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1422)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5832)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method
‘android.content.SharedPreferences
android.content.Context.getSharedPreferences(java.lang.String, int)’
on a null object reference
at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:184)
at com.example.nano.prueba.login.loginprueba.LoadPref.Load(LoadPref.java:16)
at com.example.nano.prueba.login.loginprueba.MainActivity.onCreate(MainActivity.java:41)
at android.app.Activity.performCreate(Activity.java:6221)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2611)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723) 
at android.app.ActivityThread.access$900(ActivityThread.java:172) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1422) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:145) 
at android.app.ActivityThread.main(ActivityThread.java:5832) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

solución

De acuerdo a tu mensaje de error:

android.content.Context.getSharedPreferences
ComponentInfo{com.example.nano.prueba.login.loginprueba/com.example.nano.prueba.login.loginprueba.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method ‘android.content.SharedPreferences android.content.Context.getSharedPreferences

estas llamando el método Load() desde MainActivity, el método Load() necesita recibir el Contexto, por eso el error!, modifica tu método para que lo reciba:

   public void Load(Context context){

    SharedPreferences Preferencias = context.getSharedPreferences("DatosUser", Context.MODE_PRIVATE);
    User =(Preferencias.getString("User",""));
    Pass = (Preferencias.getString("Pass", ""));

}

Aunque un diseño mejor sería crear 2 métodos que llames cuando requieras los valores de User o Pass, tu clase LoadPreferencias no necesita extender de AppCompatActivity, y aquí mismo puedes agregar los métodos para guardar los valores, setUser() y setPass() :

public class LoadPreferencias {

    public static String GetUser(Context context)
    {
     SharedPreferences Preferencias = context.getSharedPreferences("DatosUser", Context.MODE_PRIVATE);
    String   User =Preferencias.getString("User","");
        return User;
    }


    public static String GetPass(Context context)
    {
      SharedPreferences Preferencias = context.getSharedPreferences("DatosUser", Context.MODE_PRIVATE);
    String   Pass =Preferencias.getString("Pass","");
        return Pass;
    }  
} 

Desde MainActivity elecutarías los métodos de esta forma:

String usuario = LoadPreferencias.GetUser(getApplicationContext());
String password = LoadPreferencias.GetPass(getApplicationContext());
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *