Abstürzen auf die Schliche kommen.

  • Moin,


    ich habe aktuell ein Problem, das mich irgendwie zum Verzweifeln bring.


    Ich weiß, dass es an folgender Zeile in der onCreate() liegt:
    (minSDK:11,targedSDK:14)

    Java
    PreferenceManager.setDefaultValues(this, R.xml.preferences, false);


    Die preferences.xml ist vorhanden und hat so etwas ähnliches wie einen Inhalt.

    HTML
    <?xml version="1.0" encoding="utf-8"?>
    <Preference xmlns:android="http://schemas.android.com/apk/res/android" >
    	<ListPreference android:key="secondsUntilDownloadLockExpires" android:defaultValue="86400" />    
    	<ListPreference android:key="lastDownloadAtTimestamp" android:defaultValue="0" />    
    </Preference>


    Jetzt bekomme ich aber zur Laufzeit folgende Exception um die Ohren geknallt.

    Zitat

    10-12 15:39:12.023: E/AndroidRuntime(1241): FATAL EXCEPTION: main
    10-12 15:39:12.023: E/AndroidRuntime(1241): java.lang.RuntimeException: Unable to start activity ComponentInfo{.SlideView}: java.lang.ClassCastException: android.preference.Preference


    Jau, daraus schließe ich, dass das nicht ging.
    Offenbar wird versucht, meine Preference namens Preference in etwas zu casten, was nur leider völlig fehl schlägt.
    Nach längerem Herumgesuche im Netz fand ich ein Tutorial und passte meine XML auf 'PreferenceScreen' an. Seitdem läuft es.


    Meine Fragen diesbezüglich:
    Woher soll ich wissen, dass PreferenceManager.setDefaultValues() eine Ressource vom Typ PreferenceScreen erwartet?
    Wie kann ich zukünftig Zeit sparen und auf den richtigen Fehler stoßen?

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

    Einmal editiert, zuletzt von Lucas de Vil ()

  • Hi Lucas de Vil,


    Zitat

    Woher soll ich wissen, dass PreferenceManager.setDefaultValues() eine Ressource vom Typ PreferenceScreen erwartet?


    Es steht in der Developer Doku.


    Zitat

    Wie kann ich zukünftig Zeit sparen und auf den richtigen Fehler stoßen?


    Der erste Weg für in der Regel über die LogCat(Exception) und alles was dann kommt hängt halt vom Fehler ab.
    Zeit wirst du nur durch Erfahrung sparen aber dieses Problem hast du bei jeder Entwicklung egal welche Plattform oder Sprache du wählst.


    Mfg Titus

  • Danke für deine prompte Antwort, Titus. :)
    Den XML Part der Doku habe ich dann also ganz stumpf übersehen.


    Nun habe ich im weiteren Verlauf wie vermutet dasselbe Problem mit anderer Klasse, diesmal: String.
    Ich verstehe, dass PreferenceManager.getDefaultSharedPreferences(this).getLong("lastDownloadAtTimestamp", 0); einen Wert als Long auszulesen versucht.
    Ebenso verstehe ich, dass es leider einen String zurück bekommt, der sich nicht in ein long wandeln lassen möchte.


    Aber ich verstehe den Grund dafür nicht.
    Weder in der Dokumentation noch in Tutorials finde ich eine Möglichkeit, in der XML Zahlwerte zu hinterlegen.


    Klar, ich kann den String auslesen und via Long.parseLong(string); umwandeln.
    Ich hoffte eigentlich, dass getLong() das automatisch für mich täte.
    Habe ich denn überhaupt eine Möglichkeit, in der XML reine Zahlwerte in den Preferences zu hinterlegen?
    android:inputType="number" scheint nur das Editorfeld zu beeinflussen, nicht die Art der Speicherung im/Rückgabe aus der XML.


    Da aber meine Recherchen ergebnislos waren, fürchte ich mal, die Antwort ist 'nein'.
    Richtig? ;)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hi Lucas de Vil,


    Zitat

    Ich verstehe, dass PreferenceManager.getDefaultSharedPreferences(this).getLong("lastDownloadAtTimestamp", 0); einen Wert als Long auszulesen versucht. Ebenso verstehe ich, dass es leider einen String zurück bekommt, der sich nicht in ein long wandeln lassen möchte.


    Äh? Also wenn du die Methode getLong(key,defaultValue) aufrufst bekommst du auch einen long-Wert zurück und keinen String.


    mmhh versuch das mal:

    Java
    long value = PreferenceManager.getDefaultSharedPreferences(this).getLong("lastDownloadAtTimestamp", 0L);


    geht das?


    mfg Titus

  • Hi Titus,


    leider nein.

    Zitat

    10-12 17:50:29.333: W/dalvikvm(1886): threadid=1: thread exiting with uncaught exception (group=0x40015560)
    10-12 17:50:29.353: E/AndroidRuntime(1886): FATAL EXCEPTION: main
    10-12 17:50:29.353: E/AndroidRuntime(1886): java.lang.RuntimeException: Unable to start activity ComponentInfo.StartingActivity}: java.lang.ClassCastException: java.lang.String


    Ändere ich das auf den Long.parseLong((String)(PreferenceManager.getDefaultSharedPreferences(this).getString("lastDownloadAtTimestamp", "0"))); tut es.
    Immerhin lag ich da mit meiner Einschätzung nicht völlig falsch, dass es eigentlich hätte gehen sollen.


    Oder trifft das nur zu, wenn die SharedPreferences explizit als Long gesetzt wurden, was via XML File nicht möglich ist?

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hi Lucas de Vil,


    hab nochmal in die Doku geschaut und was seh ich da die Erklärung für die ganze Sache :)

    Zitat


    ListPreference:
    This preference will store a string into the SharedPreferences. This string will be the value from the setEntryValues(CharSequence[]) array.


    Link: ListPreference


    Hab auch noch ein Tut gefunden was dich vielleicht interessieren könnte.


    mfg Titus

  • Der Dokumentation entnehme ich, dass also nur Strings gehen und der Weg mit der Umwandlung der richtige ist.
    Danke, auch für das Tutorial. :)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Und noch einmal diese Kategorie.


    Diesmal bekomme ich eine NullPointerException bei folgendem Code.

    Java
    TableLayout downloadListTable = (TableLayout)findViewById(R.id.downloadCheckerTableLayout);


    Die IDE erklärt mir brav:

    Zitat

    int com.example.app.R.id.downloadCheckerTableLayout = 2131296257 [0x7f090001]


    Die XML warnt mich zwar über böse statische Bezeichner™, aber das ist mir egal.


    Der Debugger stept durch:

    Zitat

    NullPointerException.<init>() line: 36
    popupInfo(Activity).findViewById(int) line: 1647
    popupInfo(Activity).getWindow() line: 747
    popupInfo(Activity).findViewById(int) line: 1647
    popupInfo.prepareTableAccordingToMap(Map) line: 19


    Wie finde ich hier die Ursache des Problems heraus?
    Welcher Pointer ist aus welchem Grunde null und wie umgehe ich das?


    Ein Try-Catch-Block wird mir nicht sonderlich helfen, da ich genau dieses TableLayout aus genau dieser XML im Weiteren benötige...
    Grundlage der Fingerübung war eine Mischung aus folgenden Quellen:
    http://en.androidwiki.com/wiki…dding_rows_to_TableLayout
    http://i.thiyagaraaj.com/artic…popupusinglayoutinandroid


    Da es bei einem unglaublich rudimentärem und essentiellem Bestandteil kracht, weiß ich grad nicht, was ich nun tun kann.


    // Nachtrag
    Offenbar wird onCreate() auf die Klasse nicht ausgeführt bzw. meine Prüfroutine wird zuvor aufgerufen. Ob das externe setContentView() gegriffen hat, kann ich grad nicht sehen. Vermutlich aber nicht, so dass es schlicht keinen ContentView gibt aus dem das View gezogen werden könnte. Und irgendwas Anderes müsste auch noch uninitialisiert sein, was es im Normalfall nicht sein dürfte. Na, mal weitersuchen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

    Einmal editiert, zuletzt von Lucas de Vil () aus folgendem Grund: Weitere Infos

  • Hi Lucas de Vil,


    Zitat


    // Nachtrag
    Offenbar wird onCreate() auf die Klasse nicht ausgeführt bzw. meine Prüfroutine wird zuvor aufgerufen. Ob das externe setContentView() gegriffen hat, kann ich grad nicht sehen. Vermutlich aber nicht, so dass es schlicht keinen ContentView gibt aus dem das View gezogen werden könnte. Und irgendwas Anderes müsste auch noch uninitialisiert sein, was es im Normalfall nicht sein dürfte. Na, mal weitersuchen.


    Kannst du mal deinen Code der Activity posten? externe setContentView()?


    Mfg Titus

  • Hi Titus,


    leider bekomme ich das nur aus dem Kopf hin, da ich das Problem anderweitig umgangen bin.


    War:

    Java
    popupInfo info = new popupInfo();
    info.prepareTableAccordingToMap(downloadData, this);
    Dialog downloadInfo = new Dialog(info);
    downloadInfo.setContentView(R.layout.download_checker);
    downloadInfo.setTitle("Choose upgradable data");
    downloadInfo.show();


    Ist:

    Java
    final popupInfo downloadInfo = new popupInfo(this);
    downloadInfo.setContentView(R.layout.download_checker);
    downloadInfo.setTitle("Choose upgradable data");
    downloadInfo.prepareTableAccordingToMap(downloadData, this);
    downloadInfo.show();


    Ich habe also statt wie im ersten Anlauf eine Activity als Context zu übergeben einfach eine Subklasse von Dialog erstellt.
    Zwar hoffte ich zunächst, so etwas wie Delegating hinzubekommen (sprich: mein Dialog delegiert seine Arbeit an eine andere Klasse), aber da das nicht wollte mach ich das jetzt halt so. :)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!