提问人:Mc_Android 提问时间:7/4/2023 最后编辑:Petra MinalerMc_Android 更新时间:7/6/2023 访问量:24
Android:从具有共享首选项的另一个 Activity 获取复选框值,nullPointerException
Android: get checkbox value from another activity with shared preferences, nullPointerException
问:
我正在尝试使用 sharedPreferences 从另一个活动 (MainActivity) 访问复选框 (MainActivity2) 的值。
由于我想保存复选框状态,因此无论如何我都在使用 sharedPreferences。因此,我有一个布尔方法getBooleanFromPref(key),它在MainActivity2中给出了正确的输出。 但是,当我在 MainActivity 中调用此方法时,我得到一个 nullPointerException。 我的问题: 谁能解释一下,为什么我得到一个nullpointerExpection? 这是我的代码: 主要活动:
public class MainActivity extends AppCompatActivity {
private Button buttonResult, buttonActivity2;
private TextView tv_cb;
private MainActivity2 mainActivity2 = new MainActivity2();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonResult = findViewById(R.id.btn_result);
buttonActivity2 = findViewById(R.id.btn_goToAct2);
tv_cb = findViewById(R.id.tv_cb);
buttonActivity2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(getApplicationContext(), MainActivity2.class));
}
});
buttonResult.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
tv_cb.setText(String.valueOf(mainActivity2.getBooleanFromPref("checkedCB")));
}
});
}
}
主要活动2:
public class MainActivity2 extends AppCompatActivity {
private CheckBox checkBox;
private SharedPreferences preferences;
private SharedPreferences.Editor editor;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
checkBox = findViewById(R.id.checkBox);
button = findViewById(R.id.btn_back);
//--------------------------------------Shared Prefs-----------------------------------------------
preferences = PreferenceManager.getDefaultSharedPreferences(this);
editor = preferences.edit();
//--------------------------------------Shared Prefs for Checkbox----------------------------------------------------------
if (preferences.contains("checkedCB") && preferences.getBoolean("checkedCB", false) == true) {
checkBox.setChecked(true);
} else {
checkBox.setChecked(false);
}
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (checkBox.isChecked()) {
editor.putBoolean("checkedCB", true);
editor.apply();
checkBox.setChecked(true);
} else {
editor.putBoolean("checkedCB", false);
editor.apply();
checkBox.setChecked(false);
}
}
});
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity2.this, "Checkbox-Status: " + String.valueOf(getBooleanFromPref("checkedCB")), Toast.LENGTH_SHORT).show();
startActivity(new Intent(getApplicationContext(), MainActivity.class));
}
});
}
public boolean getBooleanFromPref(String key){
return preferences.getBoolean(key, false);
}
}
PS:布尔方法getBooleanFromPref在Mainactivity2中工作正常。
到目前为止,我尝试了不同的方法来访问 MainActivity2 中的复选框值:
我在 MainActivity2 中为复选框值创建了一个 getter 方法。当我从 Activity 调用此方法时,我没有获得复选框的当前值。
当我使用意图时,这是同样的问题。
我还更改了android-backup的清单值:android:allowBackup="false"
当我尝试从 MainActivity 访问 getBooleanFromPref 方法时,会发生 nullPointerException:
java.lang.NullPointerException: Attempt to invoke interface method 'boolean android.content.SharedPreferences.getBoolean(java.lang.String, boolean)' on a null object reference
at com.example.checkbox_test.MainActivity2.getBooleanFromPref(MainActivity2.java:66)
at com.example.checkbox_test.MainActivity$2.onClick(MainActivity.java:38)
at android.view.View.performClick(View.java:7441)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1211)
答:
0赞
Mc_Android
7/5/2023
#1
在我更改了定义:MainActivity2
sharedPreferences
//-----------------------Shared Prefs---------------------
preferences = getSharedPreferences("KEY", 0);
editor = preferences.edit();
以及在:MainActivity
buttonResult.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SharedPreferences pref = getSharedPreferences("KEY", 0);
boolean a = pref.getBoolean("checkedCB", false);
tv_cb.setText(String.valueOf(a));
}
});
评论
MainActivity2
onCreate
preferences
name