Android:从具有共享首选项的另一个 Activity 获取复选框值,nullPointerException

Android: get checkbox value from another activity with shared preferences, nullPointerException

提问人:Mc_Android 提问时间:7/4/2023 最后编辑:Petra MinalerMc_Android 更新时间:7/6/2023 访问量:24

问:

我正在尝试使用 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)
java android nullpointerexception sharedpreferences android-checkbox

评论

0赞 Petra Minaler 7/4/2023
如果自己创建类的实例,则不会调用该方法,也不会初始化该方法,因此会出现 NullPointerException。MainActivity2onCreatepreferences
0赞 Petra Minaler 7/4/2023
请查看 developer.android.com/reference/android/content/...,了解从上下文中获取共享首选项的另一种方法。在两个活动中以相同的值使用它。name
0赞 Mc_Android 7/4/2023
感谢您提供有关 NullPointerException 的建议,现在我明白了。我将以另一种方式查看您的链接以使用 sharedPreferences。

答:

0赞 Mc_Android 7/5/2023 #1

在我更改了定义:MainActivity2sharedPreferences

//-----------------------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));
    }
});