ListPreference verursacht absturz

  • Antworten:3
  • Bentwortet
Robbiani Renato
  • Forum-Beiträge: 614

13.02.2022, 20:54:25 via Website

Hallo zusammen

Ich kommen nicht mehr weiter. Wenn ich meine Optionen aufrufe stürzt die App ab. Es hatte mal funktioniert aber jetzt läuft es nicht mehr obwohl ich nichts geändert habe.

Im Preferences.xml erscheint die folgende Fehlermeldung:

unexpectet resource type 'array' expectet string -> auf dieser Zeile android:entryValues="@array/WertAnzeige"

Ich habe eine Liste von drei Werten woraus ich wählen kann. Aber irgend wie wiel das Ding nicht mehr.

resources.xml:

<?xml version="1.0" encoding="utf-8"?>

android:id="@+id/pr_main"
xmlns:app="http://schemas.android.com/apk/res-auto">

<PreferenceCategory
    android:id="@+id/pr_anzeige"
    android:title="@string/lbl_anzeige">
    <ListPreference
        android:defaultValue="false"
        android:entries="@array/TitelAnzeige"
        android:entryValues="@array/WertAnzeige"
        android:key="key_anzeige"
        android:summary="@string/lbl_anzeigetitel"
        android:title="@string/lbl_anzeigeopt" />
</PreferenceCategory>
<PreferenceCategory
    android:id="@+id/pr_position"
    android:title="@string/lbl_optgps">

    <SwitchPreference
        android:id="@+id/pr_switchpos"
        android:defaultValue="false"
        android:key="key_findpos"
        android:title="@string/lbl_ein_aus"
        app:summaryOff="@string/lbl_posoff"
        app:summaryOn="@string/lbl_poson" />
    <SwitchPreference
        android:id="@+id/pr_switchgps"
        android:defaultValue="false"
        android:key="key_gps"
        android:summaryOn="@string/lbl_gps_on"
        android:title="@string/lbl_netz_gps"
        app:summaryOff="@string/lbl_gps_off" />
</PreferenceCategory>
<PreferenceCategory
    android:id="@+id/pr_distanz"
    android:title="@string/lbl_distanz">

    <EditTextPreference
        android:id="@+id/pr_wertdistanz"
        android:key="key_distanz"
        android:selectAllOnFocus="true"
        android:singleLine="true"
        android:title="@string/txt_distanz"
        app:summary="@string/lbl_defdistanz" />
</PreferenceCategory>
<PreferenceCategory
    android:id="@+id/pr_sommerzeit"
    android:title="@string/lbl_sommerzeit">

    <SwitchPreference
        android:id="@+id/pr_switchsommer"
        android:defaultValue="false"
        android:key="key_sommer"
        android:summaryOff="@string/lbl_winzeit"
        android:summaryOn="@string/lbl_somzeit"
        android:title="@string/lbl_sommerfrage" />
</PreferenceCategory>

und mein SettingsFragment:

package ch.robbisoft.sun_app;

import android.content.SharedPreferences;
import android.os.Bundle;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.Preference.*;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceManager;

public class SettingsFragment extends PreferenceFragmentCompat{

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    addPreferencesFromResource(R.xml.preferences);
    //Setzen der Anzeigeoptionen
    ListPreference wer = findPreference("key_anzeige");
    CharSequence[] entries = { getString(R.string.lbl_grad), getString(R.string.lbl_gradminuten), getString(R.string.lbl_gradminutensekunden) };
    CharSequence[] entryValues = { "grd", "grdmin", "grdminsek" };
    if(wer != null) {
        wer.setEntries(entries);
        wer.setEntryValues(entryValues);
    }
    //Anzeige aufbauen
    OnPreferenceChangeListener preferenceChangeListener = new OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            if( newValue instanceof String ) {
                if( preference != null ) {
                    preference.setSummary(newValue.toString());
                    return true;
                }
            }
            return false;
        }
    };
    //Eingabe anzeigen
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getContext());
    Preference distanz = findPreference("key_distanz");
    if(distanz != null) {
        distanz.setOnPreferenceChangeListener(preferenceChangeListener);
        distanz.setSummary(pref.getString("key_distanz", "grd"));
    }
    Preference anzeige = findPreference("key_anzeige");
    if(anzeige != null) {
        anzeige.setOnPreferenceChangeListener(preferenceChangeListener);
        anzeige.setSummary(pref.getString("key_anzeige", "1000"));
    }
}

@Override
public void onResume() {
    super.onResume();
}

@Override
public void onPause() {
    super.onPause();
}

}

Wie kann ich das Problem lösen?

Gruss Renato

Kommentieren
Beste Antwort
Rafael K.
  • Forum-Beiträge: 2.359

16.02.2022, 08:30:05 via Website

Eigentlich geht es aus der Fehlermeldung ja schon sehr gut hervor.
Er versucht den initialen Wert in das EditText Feld zu setzen und versucht ihn als String aus den Preferences zu holen, findet aber einen Integer.
Vermutlich hast Du in einer vorherigen Version einen Integer in die SharedPreferences geschrieben.

Einmal Daten der App löschen sollte da eigentlich reichen.

Hilfreich?
Robbiani Renato
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 614

13.02.2022, 21:29:15 via Website

Vielleicht noch zur ergänzung die resource Datei mit den Arrays

<?xml version="1.0" encoding="utf-8"?>



Grad
Grad Minuten
Grad Minuten Sekunden

<integer-array name="WertAnzeige">
    <item>1</item>
    <item>2</item>
    <item>3</item>
</integer-array>

Gruss Renato

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 614

13.02.2022, 21:45:27 via Website

Wenn ich meine Optionen aufrufe kommt folgender Fehler:

 java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:302)
    at androidx.preference.Preference.getPersistedString(Preference.java:1706)
    at androidx.preference.EditTextPreference.onSetInitialValue(EditTextPreference.java:108)
    at androidx.preference.Preference.onSetInitialValue(Preference.java:1634)
    at androidx.preference.Preference.dispatchSetInitialValue(Preference.java:1607)
    at androidx.preference.Preference.onAttachedToHierarchy(Preference.java:1330)
    at androidx.preference.Preference.onAttachedToHierarchy(Preference.java:1345)
    at androidx.preference.PreferenceGroup.addPreference(PreferenceGroup.java:253)
    at androidx.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:173)
    at androidx.preference.PreferenceInflater.rInflate(PreferenceInflater.java:350)
    at androidx.preference.PreferenceInflater.rInflate(PreferenceInflater.java:351)
    at androidx.preference.PreferenceInflater.inflate(PreferenceInflater.java:161)
    at androidx.preference.PreferenceInflater.inflate(PreferenceInflater.java:112)
    at androidx.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:217)
    at androidx.preference.PreferenceFragmentCompat.addPreferencesFromResource(PreferenceFragmentCompat.java:364)
    at ch.robbisoft.sun_app.SettingsFragment.onCreatePreferences(SettingsFragment.java:15)
    at androidx.preference.PreferenceFragmentCompat.onCreate(PreferenceFragmentCompat.java:161)
    at androidx.fragment.app.Fragment.performCreate(Fragment.java:2949)
    at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475)
    at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:278)
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)
    at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)
    at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)
    at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3138)
    at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3072)
    at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:251)
    at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:502)
    at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1435)
    at android.app.Activity.performStart(Activity.java:8231)
    at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3861)
    at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
    at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
    at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2325)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:246)
    at android.app.ActivityThread.main(ActivityThread.java:8633)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

Aber ich kann damit leider herzlich wenig anfangen. Vielleicht weiss jemand was da schief läuft.

Gruss Renato

Hilfreich?
Kommentieren
Beste Antwort
Rafael K.
  • Forum-Beiträge: 2.359

16.02.2022, 08:30:05 via Website

Eigentlich geht es aus der Fehlermeldung ja schon sehr gut hervor.
Er versucht den initialen Wert in das EditText Feld zu setzen und versucht ihn als String aus den Preferences zu holen, findet aber einen Integer.
Vermutlich hast Du in einer vorherigen Version einen Integer in die SharedPreferences geschrieben.

Einmal Daten der App löschen sollte da eigentlich reichen.

Hilfreich?
Robbiani Renato
Kommentieren