user13024999
user13024999

Reputation:

Got an error using ListPreference in Android

I have a question about PreferenceScreen in Android Studio. I used MultiSelectListPreference and did not get an error, however when I used ListPreference, I got an error and does not open setting activity.

<PreferenceCategory
    android:title="Time Table Setting">

    <ListPreference
        android:key="Header_List"
        android:entries="@array/setting_header_list"
        android:entryValues="@array/setting_header_values"
        android:title="Display Dates"
        android:summary="Monday to Friday, Saturday or Sunday"/>
</PreferenceCategory>

<Preference
    android:key="Restart"
    android:title="Save"/>

If you have any suggestions, Please help me out. Thank you

Here is the error message that I've got

2020-03-21 22:06:26.212 14206-14206/com.pythontaro.personaltimetable E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.name, PID: 14206
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.name.appname/com.name.appname.setting.SettingsActivity}: java.lang.ClassCastException: java.util.HashSet cannot be cast to java.lang.String
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
    at android.app.ActivityThread.-wrap12(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
 Caused by: java.lang.ClassCastException: java.util.HashSet cannot be cast to java.lang.String
    at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:225)
    at androidx.preference.Preference.getPersistedString(Preference.java:1686)
    at androidx.preference.ListPreference.onSetInitialValue(ListPreference.java:255)
    at androidx.preference.Preference.onSetInitialValue(Preference.java:1614)
    at androidx.preference.Preference.dispatchSetInitialValue(Preference.java:1587)
    at androidx.preference.Preference.onAttachedToHierarchy(Preference.java:1311)
    at androidx.preference.Preference.onAttachedToHierarchy(Preference.java:1326)
    at androidx.preference.PreferenceGroup.addPreference(PreferenceGroup.java:249)
    at androidx.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:170)
    at androidx.preference.PreferenceInflater.rInflate(PreferenceInflater.java:345)
    at androidx.preference.PreferenceInflater.rInflate(PreferenceInflater.java:346)
    at androidx.preference.PreferenceInflater.inflate(PreferenceInflater.java:157)
    at androidx.preference.PreferenceInflater.inflate(PreferenceInflater.java:109)
    at androidx.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:216)
    at androidx.preference.PreferenceFragmentCompat.addPreferencesFromResource(PreferenceFragmentCompat.java:361)
    at com.name.appname.setting.SettingsActivity$SettingsFragment.onCreatePreferences(SettingsActivity.java:28)
    at androidx.preference.PreferenceFragmentCompat.onCreate(PreferenceFragmentCompat.java:160)
    at androidx.fragment.app.Fragment.performCreate(Fragment.java:2684)
    at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:280)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1175)
    at androidx.fragment.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1255)
    at androidx.fragment.app.FragmentTransition.calculateFragments(FragmentTransition.java:1138)
    at androidx.fragment.app.FragmentTransition.startTransitions(FragmentTransition.java:136)
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1989)
    at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1947)
    at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
    at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2629)
    at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2577)
    at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)
    at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)
    at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1248)
    at android.app.Activity.performStart(Activity.java:6679)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2609)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6077) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 

This is code in Setting Activity Class

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 {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        addPreferencesFromResource(R.xml.settings);
    }
}}

This is code for string value

 <!--Setting-->
<string-array name="setting_header_list">
    <item>"Friday(default)"</item>
    <item>"Saturday"</item>
    <item>"Sunday"</item>
</string-array>

<string-array name="setting_header_values">
    <item>0</item>
    <item>1</item>
    <item>2</item>
</string-array>

This is the code of line 225 in SharedPreferencesImpl.java

final StructStat stat;
    try {
        /*
         * Metadata operations don't usually count as a block guard
         * violation, but we explicitly want this one.
         */
        BlockGuard.getThreadPolicy().onReadFromDisk();
        stat = Os.stat(mFile.getPath());
    } catch (ErrnoException e) {
        return true;
    }

Upvotes: 1

Views: 234

Answers (1)

Lajos Arpad
Lajos Arpad

Reputation: 76508

From your stack trace this is the key:

Caused by: java.lang.ClassCastException: java.util.HashSet cannot be cast to java.lang.String

you are trying to use a java.util.HashSet where a java.lang.String is in use.

It's at SharedPreferencesImpl.java:225 when getString is being called. This is as far as I can go if you do not share the relevant part of your code.

EDIT

As the asker pointed out here in the comment section, the issue was that double quotation marks were used on string-array items.

Upvotes: 0

Related Questions