Произошла ошибка при использовании ListPreference в Android - PullRequest
1 голос
/ 22 марта 2020

У меня есть вопрос о PreferenceScreen в Android Studio. Я использовал MultiSelectListPreference и не получил ошибку, , однако, когда я использовал ListPreference, я получил ошибку и не открыл настройку активности.

<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"/>

Если у вас есть предложения, пожалуйста, помогите мне. Спасибо

Вот сообщение об ошибке, которое я получил

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) 

Это код в настройке класса активности

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);
    }
}}

Это код для строкового значения

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

Это код строки 225 в 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;
    }

1 Ответ

0 голосов
/ 22 марта 2020

Из вашей трассировки стека это ключ:

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

вы пытаетесь использовать java.util.HashSet, когда используется java.lang.String.

Это на SharedPreferencesImpl. java: 225 при вызове getString. Это насколько я могу go, если вы не передаете соответствующую часть своего кода.

РЕДАКТИРОВАТЬ

Как спрашивающий указал здесь в разделе комментариев, проблема заключалась в том, что двойные кавычки были использованы для элементов массива строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...