1

我有 2 个活动,MainActivity 和 SettingsActivity。当设置按钮被按下时,SettingsActivity 被启动并加载 PreferenceFragment。

应用程序在片段启动时立即崩溃:

9188/com.app.android.judge E/AndroidRuntime:致命异常:主进程:com.app.android.judge,PID:9188 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.app.android.judge/ com.app.android.judge.Settings.SettingsActivity}:java.lang.ClassCastException:java.util.HashSet 无法在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2666) 在 android 上转换为 java.lang.Boolean .app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android .os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6121) 在 java.lang.reflect.Method。在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 的 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 调用(本机方法) 原因:java。 lang.ClassCastException: java.util.HashSet 不能在 android.preference.Preference.getPersistedBoolean(Preference.java:1702)在 android.preference.TwoStatePreference.onSetInitialValue(TwoStatePreference.java:188) 在 android.preference.Preference.dispatchSetInitialValue(Preference.java:1391) 在 android.preference.Preference.onAttachedToHierarchy(Preference.java:1185) 在 android。 android.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java: 上的preference.PreferenceGroup.addPreference(PreferenceGroup.java:163)105) 在 android.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:104) 在 android.preference.GenericInflater.rInflate(GenericInflater.java:490) 在 android.preference.GenericInflater.rInflate(GenericInflater.java:495) 在 android。 preference.GenericInflater.inflate(GenericInflater.java:327) 在 android.preference.GenericInflater.inflate(GenericInflater.java:264) 在 android.preference。PreferenceManager.inflateFromResource(PreferenceManager.java:280) 在 android.preference.PreferenceFragment.addPreferencesFromResource(PreferenceFragment.java:326) 在 com.app.android.judge.Settings.MatchPreferenceFragment.onCreate(MatchPreferenceFragment.java:24) 在 android.app .Fragment.performCreate(Fragment.java:2336) 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:949) 在 android.app.BackStackRecord.setLastIn(BackStackRecord.java:860) 在 android.app.BackStackRecord.calculateFragments(BackStackRecord.java:883) 在 android.app.BackStackRecord.run(BackStackRecord.java:728) 在 android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1578) 在 android。 app.FragmentController.execPendingActions(FragmentController.java:371) 在 android.app.Activity.performStart(Activity.java:6698) 在 android.app.ActivityThread。performLaunchActivity(ActivityThread.java:2629) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread. java:1478) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6121) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 在 com.android.internal.os.ZygoteInit。主要(ZygoteInit.java:779)主要(ZygoteInit.java:779)主要(ZygoteInit.java:779) 

我要启动的 PrefereneFragment 是:

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文件是:

    <?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>

我看到了错误,并将其缩小到我的 CheckBoxPreference、XML 和 PreferenceFragment 之间发生的事情。不幸的是,不确定是什么。任何帮助表示赞赏。

编辑:我尝试重新安装应用程序并删除应用程序数据。错误仍然存​​在。

编辑:清理和重建没有修复。

编辑:最新的回购 - https://github.com/Jaren831/Judge/tree/production

4

0 回答 0