首页 > 解决方案 > 对简历上的首选项进行更改时应用程序崩溃

问题描述

我的首选项页面使我的应用程序崩溃时遇到问题。在第一次访问时,它按预期运行。但是,一旦我重新访问该页面并尝试更改开关,应用程序就会崩溃。以下是我喜欢的 XML 的样子:

    xmlns:app="http://schemas.android.com/apk/res-auto">

    <PreferenceCategory
        android:gravity="left"
        android:title="@string/description_title"
        app:iconSpaceReserved="false">

        <SwitchPreference
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:key="@string/pallet_pref_key"
            android:title="@string/pallet_pref"
            app:iconSpaceReserved="false" />
        <SwitchPreference
            android:key="@string/nose_pref_key"
            android:title="@string/nose_pref"
            app:iconSpaceReserved="false" />
        <SwitchPreference
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:key="@string/finish_pref_key"
            android:title="@string/finish_pref"
            app:iconSpaceReserved="false" />
    </PreferenceCategory>

</PreferenceScreen>

Java看起来像这样:

import android.os.Bundle;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceManager;
import androidx.preference.SwitchPreference;

public class SettingsActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.settings_activity);

        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings, new SettingsFragment())
                .commit();
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }

    }

    public static class SettingsFragment extends PreferenceFragmentCompat {

        private SharedPreferences sharedPref;
        private boolean pNose;
        private boolean pPallet;
        private boolean pFinish;

        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey);
            sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());
            sharedPref.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() {
                @Override
                public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
                    if(s.equals(getResources().getString(R.string.pallet_pref_key))) {
                        pPallet = sharedPreferences.getBoolean(s,false);
                        SwitchPreference pNose = findPreference(getResources().getString(R.string.nose_pref_key));
                        SwitchPreference pFinish = findPreference(getResources().getString(R.string.finish_pref_key));
                        if (pPallet) {
                            pNose.setChecked(false);
                            pFinish.setChecked(false);
                        }
                    }
                    else if(s.equals(getResources().getString(R.string.nose_pref_key))) {
                        pNose = sharedPreferences.getBoolean(s,false);
                        SwitchPreference pPallet = findPreference(getResources().getString(R.string.pallet_pref_key));
                        SwitchPreference pFinish = findPreference(getResources().getString(R.string.finish_pref_key));
                        if (pNose) {
                            pPallet.setChecked(false);
                            pFinish.setChecked(false);
                        }
                    }
                    else if(s.equals(getResources().getString(R.string.finish_pref_key))) {
                        pFinish = sharedPreferences.getBoolean(s,false);
                        SwitchPreference pPallet = findPreference(getResources().getString(R.string.pallet_pref_key));
                        SwitchPreference pNose = findPreference(getResources().getString(R.string.nose_pref_key));
                        if (pFinish) {
                            pNose.setChecked(false);
                            pPallet.setChecked(false);
                        }
                    }
                }
            });
        }
    }
}

所以基本上我只是想让它一次只能启用一个开关。我做了一些研究,发现这里有几个线程提到我应该添加这个代码:

@Override
protected void onResume() {
    super.onResume();
    // Set up a listener whenever a key changes
    getPreferenceScreen().getSharedPreferences()
            .registerOnSharedPreferenceChangeListener(this);
}

@Override
protected void onPause() {
    super.onPause();
    // Unregister the listener whenever a key changes
    getPreferenceScreen().getSharedPreferences()
            .unregisterOnSharedPreferenceChangeListener(this);
}

我在想这可能是崩溃的原因,但是当我在“OnSharedPreferenceChangeListener() {”下面添加代码时,onResume() 和 onPause() 是灰色的,除非我将它提升到顶部,在这种情况下 this 关键字引发错误。有谁看到我做错了什么?

这是我在崩溃时遇到的错误: logCat 错误

标签: androidandroid-studio

解决方案


推荐阅读