首页 > 解决方案 > SwitchPreferenceCompat setOnPreferenceChangeListener 使应用程序崩溃

问题描述

当我进入我的设置活动时我的应用程序崩溃并且错误是

java.lang.NullPointerException:尝试在 com.may.restroomv2.SettingsActivity_2$SettingsFragment.onCreatePreferences(SettingsActivity_2.爪哇:77)

我的代码是

XML

<PreferenceCategory app:title="Dark Mode">

   <SwitchPreferenceCompat
        app:summaryOff="Not active"
        android:defaultValue="false"
        app:summaryOn="Active"
        app:key="@string/darkmode"
        app:title="Dark Mode" />
    
</PreferenceCategory>

设置片段

SharedPreferences sharedPref;
sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());
SwitchPreferenceCompat switch_darkmode = (SwitchPreferenceCompat) findPreference("@string/darkmode");

switch_darkmode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        if (switch_darkmode.isChecked()) {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            // bottomNavigationView.setBackgroundResource(R.drawable.rounded_nav_darkmode);
        } else {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            // bottomNavigationView.setBackgroundResource(R.drawable.rounded_nav);
        }
        return false;
    }
});

标签: javaandroid-preferencesandroid-settings

解决方案


尝试这个:

SwitchPreferenceCompat switch_darkmode = (SwitchPreferenceCompat) findPreference(
    getResources().getString(R.string.darkmode)
);

解释

findPreference(CharSequence key)将参数作为CharSequence. 如果你放"@string/darkmode",它会从字面上得到这个字符串作为键。这就是为什么您findPreference未能找到switch_darkmode然后以NullPointerException. 只有当您在 XML 文件(布局、菜单或首选项等)中使用这种表达式时,Android Studio 才会在构建时将其转换为相应的资源值。


推荐阅读