为了账号安全,请及时绑定邮箱和手机立即绑定

SharedPreferences 的问题 - 如何使用?

SharedPreferences 的问题 - 如何使用?

慕沐林林 2023-06-21 16:13:24
我正在制作一个带有计数器的应用程序,当我点击 ImageView 时计数器会上升。这行得通,但现在我想将计数器保存到 SharedPreferences 对象。我试图在 onCreate 方法中初始化 SP 对象,这显然不起作用。当我尝试在全局范围内使用 sp.getInt(...) 时,它也不起作用。我明白为什么会出现问题(尝试在 sp 对象初始化之前从它获取 Integer),但我不知道如何解决它。public class MainActivity extends AppCompatActivity {    int counterint;    TextView counter;    String stringnumber;    SharedPreferences sharedPreferences = this.getSharedPreferences("com.example.hugelon", Context.MODE_PRIVATE);    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        sharedPreferences.getInt("hugcounter", 0);    }    public void hughim(View view){        counter = findViewById(R.id.countertv);        stringnumber = counter.getText().toString();        counterint = Integer.parseInt(stringnumber);        counterint++;        counter.setText(Integer.toString(counterint));        sharedPreferences.edit().putInt("hugcounter", counterint);    }}java.lang.RuntimeException:无法实例化活动 ComponentInfo {com.example.hugelon/com.example.hugelon.MainActivity}:java.lang.NullPointerException:尝试调用虚拟方法'android.content.SharedPreferences android.content.Context。空对象引用上的 getSharedPreferences(java.lang.String, int)'Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' 对空对象引用
查看完整描述

4 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

getSharedPreferences()您在实际创建之前调用Activity。您需要初始化SharedPreferencesin onCreate():


@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    sharedPreferences = this.getSharedPreferences("com.example.hugelon", Context.MODE_PRIVATE); // Here, this is initialized AFTER super.onCreate

    ...

}

Activity延伸自Context且 是Context所需要的SharedPreferences。我建议您在这里阅读有关 Android 活动生命周期的信息:


https://developer.android.com/guide/components/activities/activity-lifecycle


为了证明该值确实被保存,您可以尝试使用以下代码来测试保存的值:


@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    sharedPreferences = this.getSharedPreferences("com.example.hugelon", Context.MODE_PRIVATE); // Here, this is initialized AFTER super.onCreate


    int storedValue = sharedPreferences.getInt("hugcounter", 0);

    Toast.makeText(this, "Saved value: " + storedValue, Toast.LENGTH_LONG).show();

}

并且,不要忘记通过调用来存储值apply():


SharedPreferences.Editor editor = sharedPreferences.edit();

editor.putInt("hugcounter", counterint);

editor.apply();


查看完整回答
反对 回复 2023-06-21
?
波斯汪

TA贡献1811条经验 获得超4个赞

你只是没有在 oncreate 设置初始值


      public class MainActivity extends AppCompatActivity {


            int counterint;

            TextView counter;

            String stringnumber;

            SharedPreferences sharedPreferences;


            @Override

            protected void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);

                setContentView(R.layout.activity_main);

    counter = findViewById(R.id.countertv);

        sharedPreferences = this.getSharedPreferences("com.example.hugelon", Context.MODE_PRIVATE);


                stringnumber=String.valueOf(sharedPreferences.getInt("hugcounter", 0));

counter.setText(stringnumber);

            }



            public void hughim(View view){


                counter = findViewById(R.id.countertv);


                stringnumber = counter.getText().toString();

                counterint = Integer.parseInt(stringnumber);

                counterint++;

                counter.setText(Integer.toString(counterint));


                sharedPreferences.edit().putInt("hugcounter", counterint);


            }


        }


查看完整回答
反对 回复 2023-06-21
?
DIEA

TA贡献1820条经验 获得超2个赞

SharedPreferences 在初始化之前需要一个活动引用,这就是thisin 的目的:


SharedPreferences sharedPreferences = this.getSharedPreferences("com.example.hugelon", Context.MODE_PRIVATE);

您的代码的问题是this在您初始化 SharedPreferences 对象时它为空。这样做的原因是它this在onCreate(). 因此,一个快速的解决方案是将 SharedPreferences 对象的初始化移动到 onCreate 中。这是您的课程之后的样子的片段:


public class MainActivity extends AppCompatActivity {


int counterint;

TextView counter;

String stringnumber;

SharedPreferences sharedPreferences;


@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);


    sharedPreferences = this.getSharedPreferences("com.example.hugelon", Context.MODE_PRIVATE);

    sharedPreferences.getInt("hugcounter", 0);

  }


}

附录:

将 的值sharedPreferences.getInt("hugcounter", 0)放入变量中,如下所示:


int myValue = sharedPreferences.getInt("hugcounter", 0);

我希望这有帮助。编码愉快!


查看完整回答
反对 回复 2023-06-21
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

  1. 在 onCreate 方法中初始化 SharedPreference

  2. 您尝试将 Int 放入 SharedPreference 但没有保存它,因为您需要调用

    sharedPreferences.edit().putInt("hugcounter", counterint).apply()

    或者

    sharedPreferences.edit().putInt("hugcounter", counterint).commit()

为了这个目的。因此使用commit()apply()保存在本地存储中。

查看完整回答
反对 回复 2023-06-21
  • 4 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信