如何在Android中获取SharedPreference的空值

时间:2016-02-06 18:29:58

标签: android sharedpreferences

我在添加值和获取存储值时已经创建了这样的共享首选方法,因为我还将在另一个类中使用它来更新值。

public static void addPass(String key, String value, Context context) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(key, value);
    editor.commit();
}
public static String getPass(String key, Context context) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(key, null);
}

我想使用共享偏好的空值,所以我做了一个像这样的代码

password = getPass("name", null);

if ((password.equals(""))){
    if (s.toString().equals("1234")) {
        Intent Menu = new Intent(LogIn.this, Menu.class);
        LogIn.this.startActivity(Menu);

    } else {
        Toast.makeText(LogIn.this, "Incorrect Password", Toast.LENGTH_SHORT).show();
    }
}
else {
    realpass = getPass("password", LogIn.this);
    if (s.toString().equals(realpass)) {
        Intent Menu = new Intent(LogIn.this, Menu.class);
        LogIn.this.startActivity(Menu);

    } else {
        Toast.makeText(LogIn.this, "Incorrect Password", Toast.LENGTH_SHORT).show();
    }
}

如果密码为空,则用户应输入1234作为密码,否则如果为空,则将设置存储在共享首选项中的内容作为密码。 但使用这个我会得到这样的错误:

02-06 18:25:25.267 2044-2044/com.secsys.gagacamaso.gagacamaso E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.secsys.gagacamaso.gagacamaso, PID: 2044
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
        at android.preference.PreferenceManager.getDefaultSharedPreferencesName(PreferenceManager.java:375)
        at android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:370)
        at com.secsys.gagacamaso.gagacamaso.LogIn.getPass(LogIn.java:195)
        at com.secsys.gagacamaso.gagacamaso.LogIn$1.onTextChanged(LogIn.java:55)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7991)
        at android.widget.TextView.setText(TextView.java:4345)
        at android.widget.TextView.setText(TextView.java:4199)
        at android.widget.EditText.setText(EditText.java:84)
        at android.widget.TextView.setText(TextView.java:4174)
        at com.secsys.gagacamaso.gagacamaso.LogIn$6.onClick(LogIn.java:136)
        at android.view.View.performClick(View.java:5198)
        at android.view.View$PerformClick.run(View.java:21147)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

第195行是这样的:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

第55行是这样的:

password = getPass("name", null);

非常感谢那些试图帮助我解决这个问题的人,一直试图找出如何获得默认值并更新它并整天存储密码

编辑部分

我能够将默认密码设置为1234但是当我尝试更改密码时,我仍然获得1234作为密码,这是我的另一个类的代码,另一个名为 LogIn.java

Menu.java

ok.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String oldpassword = oldpass.getText().toString();
                    String newpassword = newpass.getText().toString();
                    if (LogIn.password.equals("")) {
                        if (oldpassword.toString().equals("1234")) {
                            login.getPass("password",Menu.this);
                            login.addPass("password",newpassword,getApplicationContext());
                            Toast.makeText(Menu.this,"New password saved!",Toast.LENGTH_SHORT).show();
                        }
                        else {
                            Toast.makeText(Menu.this,"Old Password is not correct",Toast.LENGTH_SHORT).show();
                        }
                    }
                    else {
                        if (oldpassword.equals(LogIn.realpass)){
                            login.getPass("password",Menu.this);
                            login.addPass("password", newpassword, getApplicationContext());
                            Toast.makeText(Menu.this,"New password saved!",Toast.LENGTH_SHORT).show();
                        }
                        else{
                            Toast.makeText(Menu.this,"Old Password is not correct",Toast.LENGTH_SHORT).show();
                        }
                    }

                }
            });

1 个答案:

答案 0 :(得分:2)

这是因为您将null qwertyuiop 113 119 101 114 116 121 117 105 111 112 asdfghjkl; 97 115 100 102 103 104 106 107 108 59 zxcvbnm,./ 122 120 99 118 98 110 109 44 46 47 ^Z 传递给getPass方法。

Context

因此,以下代码将崩溃,如stacktrace中所示:

password = getPass("name", null); // <-- Null Context

向其发送适当的应用SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); // <-- Null Context ,它将起作用。

此外,要获得您想要的内容,请在Context方法中使用getString这样的内容:

getPass

如果prefs不存在,这将获得一个空字符串,并且您的代码将在您之后与空字符串进行比较时起作用。