我正在制作一个带有计数器的应用程序,当我点击 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
...
}
Activity
从Context
延伸,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。这样做的原因是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);
我希望这有所帮助。祝您编码愉快!
-
在 onCreate 方法中初始化共享首选项
-
您尝试将Int放入共享首选项中,但没有保存它,因为您需要调用
sharedPreferences.edit().putInt("hugcounter", counterint).apply()
或
sharedPreferences.edit().putInt("hugcounter", counterint).commit()
为此。因此,请使用commit()
或apply()
保存在本地存储中。
在此处查看有关apply()
方法的文档