共享首选项的问题 - 如何使用



我正在制作一个带有计数器的应用程序,当我点击 ImageView 时,计数器会上升。这有效,但现在我想将计数器保存到共享首选项对象。

我尝试在onCreate方法中初始化SP对象,这显然不起作用。当我尝试全局使用 sp.getInt(...) 时,它也不起作用。 我明白为什么会出现问题(尝试在初始化之前从 sp 对象获取整数),但我不知道如何解决。

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: Try to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' 在空对象引用上

由以下原因引起:java.lang.NullPointer异常:尝试调用虚拟方法 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' 在空对象引用上

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

@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
...
}

ActivityContext延伸,SharedPreferences需要Context。我建议您在此处阅读有关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();

乔瓦尼的答案是正确的,你只是没有在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);
}
}

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

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

代码的问题在于,在初始化 SharedPreferences 对象时,this为 null。这样做的原因是thisonCreate()处初始化。因此,一个快速的解决方案是将 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);

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

  1. 在 onCreate 方法中初始化共享首选项

  2. 您尝试将Int放入共享首选项中,但没有保存它,因为您需要调用

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

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

为此。因此,请使用commit()apply()保存在本地存储中。

在此处查看有关apply()方法的文档

最新更新