SharedPreferences 的问题 - 如何使用?

我正在制作一个带有计数器的应用程序,当我点击 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)' 对空对象引用


慕沐林林
浏览 165回答 4
4回答

跃然一笑

getSharedPreferences()您在实际创建之前调用Activity。您需要初始化SharedPreferencesin onCreate():@Overrideprotected 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为了证明该值确实被保存,您可以尝试使用以下代码来测试保存的值:@Overrideprotected 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();

波斯汪

你只是没有在 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);            }        }

DIEA

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;@Overrideprotected 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);我希望这有帮助。编码愉快!

斯蒂芬大帝

在 onCreate 方法中初始化 SharedPreference您尝试将 Int 放入 SharedPreference 但没有保存它,因为您需要调用sharedPreferences.edit().putInt("hugcounter", counterint).apply()或者sharedPreferences.edit().putInt("hugcounter", counterint).commit()为了这个目的。因此使用commit()或apply()保存在本地存储中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java