我有 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