ClassCastException on PreferenceFragment start

249 Views Asked by At

I have 2 activites, MainActivity and SettingsActivity. When settings button is pushed, SettingsActivity is started and loads PreferenceFragment.

App immediately crashes on fragment start:

9188/com.app.android.judge E/AndroidRuntime: FATAL EXCEPTION: main Process: com.app.android.judge, PID: 9188 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.app.android.judge/com.app.android.judge.Settings.SettingsActivity}: java.lang.ClassCastException: java.util.HashSet cannot be cast to java.lang.Boolean at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2666) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6121) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) Caused by: java.lang.ClassCastException: java.util.HashSet cannot be cast to java.lang.Boolean at android.app.SharedPreferencesImpl.getBoolean(SharedPreferencesImpl.java:273) at android.preference.Preference.getPersistedBoolean(Preference.java:1702) at android.preference.TwoStatePreference.onSetInitialValue(TwoStatePreference.java:188) at android.preference.Preference.dispatchSetInitialValue(Preference.java:1391) at android.preference.Preference.onAttachedToHierarchy(Preference.java:1185) at android.preference.PreferenceGroup.addPreference(PreferenceGroup.java:163) at android.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:105) at android.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:104) at android.preference.GenericInflater.rInflate(GenericInflater.java:490) at android.preference.GenericInflater.rInflate(GenericInflater.java:495) at android.preference.GenericInflater.inflate(GenericInflater.java:327) at android.preference.GenericInflater.inflate(GenericInflater.java:264) at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:280) at android.preference.PreferenceFragment.addPreferencesFromResource(PreferenceFragment.java:326) at com.app.android.judge.Settings.MatchPreferenceFragment.onCreate(MatchPreferenceFragment.java:24) at android.app.Fragment.performCreate(Fragment.java:2336) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:949) at android.app.BackStackRecord.setLastIn(BackStackRecord.java:860) at android.app.BackStackRecord.calculateFragments(BackStackRecord.java:883) at android.app.BackStackRecord.run(BackStackRecord.java:728) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1578) at android.app.FragmentController.execPendingActions(FragmentController.java:371) at android.app.Activity.performStart(Activity.java:6698) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2629) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727)  at android.app.ActivityThread.-wrap12(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:154)  at android.app.ActivityThread.main(ActivityThread.java:6121)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 

The PrefereneFragment I want to launch is:

public class MatchPreferenceFragment extends PreferenceFragment
    implements Preference.OnPreferenceChangeListener {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.match_preference);

    Preference player1Life = findPreference(getString(R.string.player1_life_key));
    Preference player1Color = findPreference(getString(R.string.player1_color_key));
    Preference player1Energy = findPreference(getString(R.string.player1_energy_key));
    Preference player1Clues = findPreference(getString(R.string.player1_clue_key));
    Preference player1Poison = findPreference(getString(R.string.player1_poison_key));

    Preference player2Life = findPreference(getString(R.string.player2_life_key));
    Preference player2Color = findPreference(getString(R.string.player2_color_key));
    Preference player2Energy = findPreference(getString(R.string.player2_energy_key));
    Preference player2Clues = findPreference(getString(R.string.player2_clue_key));
    Preference player2Poison = findPreference(getString(R.string.player2_poison_key));


    bindPreferenceSummaryToValue(player1Life);
    bindPreferenceSummaryToValue(player1Color);
    bindPreferenceSummaryToValue(player1Energy);
    bindPreferenceSummaryToValue(player1Clues);
    bindPreferenceSummaryToValue(player1Poison);

    bindPreferenceSummaryToValue(player2Life);
    bindPreferenceSummaryToValue(player2Color);
    bindPreferenceSummaryToValue(player2Energy);
    bindPreferenceSummaryToValue(player2Clues);
    bindPreferenceSummaryToValue(player2Poison);

    setHasOptionsMenu(true);
}

@Override
public void onPrepareOptionsMenu(Menu menu) {
    menu.findItem(R.id.action_search).setVisible(false);
    menu.findItem(R.id.action_settings).setVisible(false);

    super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onPreferenceChange(Preference preferences, Object key) {
    String stringValue = key.toString();
    if (preferences instanceof ListPreference) {
        ListPreference listPreference = (ListPreference) preferences;
        int prefIndex = listPreference.findIndexOfValue(stringValue);
        if (prefIndex >= 0) {
            CharSequence[] labels = listPreference.getEntries();
            preferences.setSummary(labels[prefIndex]);
        }
    } else if (preferences instanceof EditTextPreference) {
        preferences.setSummary(stringValue);
    }
    return true;
}

private void bindPreferenceSummaryToValue(Preference preference) {
    preference.setOnPreferenceChangeListener(this);
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(preference.getContext());
    String preferenceString = preferences.getString(preference.getKey(), "");
    onPreferenceChange(preference, preferenceString);
}
}

XML file is:

    <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:title="@string/match_settings_title">
    <PreferenceCategory
        android:title="@string/player1_settings_title"
        android:key="player1_match_settings">
        <EditTextPreference
            android:key="@string/player1_life_key"
            android:inputType="number"
            android:title="@string/player1_life_settings_title"
            android:dialogTitle="@string/player1_life_dialog_title"
            android:defaultValue="@string/player1_life_default_value"/>
        <CheckBoxPreference
            android:key="@string/player1_counters_key"
            android:title="@string/player1_counters_title"
            android:summary="Toggle Counters"/>
        <EditTextPreference
            android:key="@string/player1_energy_key"
            android:inputType="number"
            android:title="@string/energy_title"
            android:dialogTitle="@string/energy_dialog_title"
            android:defaultValue="@string/player1_energy_default_value"/>
        <EditTextPreference
            android:key="@string/player1_clue_key"
            android:inputType="number"
            android:title="@string/clue_title"
            android:dialogTitle="@string/clue_dialog_title"
            android:defaultValue="@string/player1_clue_default_value"/>
        <EditTextPreference
            android:key="@string/player1_poison_key"
            android:inputType="number"
            android:title="@string/poison_title"
            android:dialogTitle="@string/poison_dialog_title"
            android:defaultValue="@string/player1_poison_default_value"/>
        <ListPreference
            android:key="@string/player1_color_key"
            android:title="@string/player1_color_settings_title"
            android:entries="@array/colorEntries"
            android:entryValues="@array/colorValues"
            android:summary="%s"
            android:defaultValue="@string/player1_color_default_value">
        </ListPreference>
    </PreferenceCategory>

    <PreferenceCategory
        android:title="@string/player2_settings_title"
        android:key="player2_match_settings">
        <EditTextPreference
            android:key="@string/player2_life_key"
            android:inputType="number"
            android:title="@string/player2_life_settings_title"
            android:dialogTitle="@string/player2_life_dialog_title"
            android:defaultValue="@string/player2_life_default_value"/>
        <CheckBoxPreference
            android:key="@string/player2_counters_key"
            android:title="@string/player2_counters_title"
            android:summary="Toggle Counters"/>
        <EditTextPreference
            android:key="@string/player2_energy_key"
            android:inputType="number"
            android:title="@string/energy_title"
            android:dialogTitle="@string/energy_dialog_title"
            android:defaultValue="@string/player2_energy_default_value"/>
        <EditTextPreference
            android:key="@string/player2_clue_key"
            android:inputType="number"
            android:title="@string/clue_title"
            android:dialogTitle="@string/clue_dialog_title"
            android:defaultValue="@string/player2_clue_default_value"/>
        <EditTextPreference
            android:key="@string/player2_poison_key"
            android:inputType="number"
            android:title="@string/poison_title"
            android:dialogTitle="@string/poison_dialog_title"
            android:defaultValue="@string/player2_poison_default_value"/>
        <ListPreference
            android:key="@string/player2_color_key"
            android:title="@string/player2_color_settings_title"
            android:entries="@array/colorEntries"
            android:entryValues="@array/colorValues"
            android:summary="%s"
            android:defaultValue="@string/player2_color_default_value">
        </ListPreference>
    </PreferenceCategory>

</PreferenceScreen>

I see the error, and have narrowed it down to something going on between my CheckBoxPreference, XML, and PreferenceFragment. Unfortunately, not exactly sure what. Any help is appreciated.

Edit: I have tried reinstalling the app and deleting app data. Error still persists.

Edit: Cleaning and rebuilding did not fix.

Edit: latest repo- https://github.com/Jaren831/Judge/tree/production

0

There are 0 best solutions below