Beiträge von Marco Feltmann

    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?

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

    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?

    Ich habe ein ähnlich gelagertes Verständnisproblem.


    Eine Anwendung, zwei Tabs mit je einem eigenen Intent.
    Rufe ich jetzt aus einem Intent (sagen wir mal dem Zweiten) einen weiteren Intent mit der Bitte um Rückgabewert auf, beispielsweise um einen Punkt zur Liste hinzuzufügen, kachelt die App ab.


    Java
    public void addItemToStockList() {
      Intent addItemIntent = new Intent(this, EditItem.class);
      startActivityForResult(addItemIntent, ACTIVITY_CREATE);
    }


    onActivityResult() ist in der Klasse des aufrufenden Intents (StockListActivity.java) implementiert.


    Die EditItem.java sieht recht unspektakulär aus, weshalb ich nur den Button aufzeige:


    Ich stelle fest: die Activity geht einmal durch einen RunLoop und meine onActivityResult()-Implementation wird in der Klasse für das TaActivity (TabControllerActivity) erwartet.


    Mutmaßlich kann ich daran auch nix ändern.


    Welche Möglichkeiten habe ich, onActivityResult() einfach an den im Tab aktuellen Intent weiterzuleiten?
    Eine Art Responder Chain habe ich nicht ausfindig machen können, das Activity Lifecycle Diagramm ist auch nicht sehr hilfreich für mich.



    ArtooDetoo
    Sehr gute Frage. Rein intuitiv würde ich sagen, einfach via tabHost.getCurrentTab() eine Referenz auf den aktuellen TabSpec holen und dessen Intent via setContent() neu setzen.
    Dummerweise liefert getCurrentTab() einen Integer zurück, keine Referenz auf den aktuellen Tab. getCurrentTabView() liefert immerhin ein View...

    Nun ja, du hast eine FrameLayout mit der ID @android:id/tabcontent, deren Inhalt dynamisch geändert wird.
    Das ist doch so ziemlich das, was du möchtest. Nur dass du halt anstelle des TabWidgets oben deinen Spinner haben möchtest.


    Sicherlich lässt sich in die Sourcen von TabHost reinschauen und erkennen, was da geschieht.
    Ansonsten lässt sich das dazugehörige android.widget.FrameLayout bestimmt anpassen.


    Wenn's einfach gehen soll versuch doch das TabWidget anstelle des Spinners. ;)

    hmm was heisst nix zu befürchten ???


    Das heißt genau das: ich habe bei einem layout Ordner nix zu befürchten.


    Später™ wird sich das ändern, momentan bin ich aber gänzlich zufrieden, wenn ich mich um nicht allzu viel zusätzliches Gerödel kümmern muss.
    Später™ meint, wenn ich wirklich einmal so etwas wie eine App in den Market stellen will.


    Noch bin ich aber nicht überzeugt. ;)

    Moin,


    ich stehe bereits vor meinem ersten nicht lösbaren Problem.


    Ausgangssituation (funktional)




    So weit, so gut, alles läuft.
    Sprich: ich halte etwas länger auf einem Eintrag gedrückt und bekomme 'Modify Item' und 'Delete Item' als Kontextmenü angezeigt.


    Jetzt möchte ich allerdings die Funktionalität übernehmen, auf Knopfdruck den Datensatz aus dieser Liste in eine andere Tabelle zu übernehmen.
    Dafür dachte ich zunächst an einen ToggleButton. Einzige Änderung ist dann im


    Sieht auch total gut aus, ich kann da auf dem Button rumdrücken (natürlich erst einmal ohne das etwas passiert, aber dazu später), doch:
    mein Kontextmenü erscheint nicht mehr.


    Dass ein Button einen Klick abfängt und weiterleitet ist mir bewusst und durchaus so gewollt. Aber leider bekomme ich offenbar auch keinen Klick auf das Textfeld registriert.


    Welche Möglichkeiten habe ich, sowohl ein bedienbares Element wie einen Toggle Button als auch das Kontextmenü in meine ListView einzubinden?

    Ich kenne nur das Facebook Android SDK von Facebook selbst.
    Wenn die nicht aktuell sind, dann ist es vermutlich niemand...


    https://developers.facebook.com/docs/reference/androidsdk/


    Twitter bietet auch eine API auf seinen Seiten an, ich weiß nur nicht, ob die rein remote zugänglich sind oder auch als Android-SDK vorliegen.
    Da man sich für diese Information anmelden müsste und ich nicht vorhabe damit zu arbeiten überlasse ich das mal dir. :)


    https://dev.twitter.com/

    Die Idee klingt ganz gut.


    Die serverseitige SQL Datenbank würde ich in der Tat über ein Webinterface ansteuern.
    Ist halt angenehmer als direkter Datenbankzugriff, da du mehr Kontrolle über die reingereichten Daten hast.


    PHP und Python sei Dank brauchst du da nicht mal ein GUI für basteln sondern kannst das über die GET- und POST-Requests regeln.
    Leider haben die Skripte eine gewisse Ausführungszeit. Es wäre also sinnvoll, irgendwo in der lokalen SQLite Datenbank ein Feld '_synchronised' zu pflegen, welches bei jeder Änderung des Datensatzes natürlich wieder auf 'false' gesetzt wird.


    Ebenso sollte der SyncService meiner Erfahrung nach jeden zu synchronisierenden Datensatz einzeln abgleichen. Dauert zwar länger, ist aber stabiler, sollte zwischendrin die Verbindung wegbrechen.


    Natürlich würde die Synchronisation in mehreren Schritten verlaufen müssen. Du bräuchtest eine Datensatz-ID, die unabhängig des Primary Keys ist und einen Timestamp der letzten Änderung.


    Dann geht es sinngemäß so:

    Auf "einem anderen Gerät" würde ich einfach unter dem Spinner ein View basteln und den Inhalt dieses Views dynamisch ändern.
    Als ich mich gestern etwas näher mit dem Tab View beschäftigt habe, stellte ich erfreut fest, dass auch Android diese Möglichkeit bietet.


    Anregungen dafür findest du beispielsweise in diesem Tutorial aus der Hello View-Gruppe.

    Ich glaube, das gehört am Besten hier hin. :)


    Wie im Vorstellungsthread bereits angesprochen ist mein Device ein Neo FreeRunner der Firma Openmoko Inc.
    Es ist natürlich kein 'Android-featured device', aber den Jungs und Mädels von Android On Freerunner sei Dank gibt es trotzdem eine relativ lauffähige Portierung von Android für den Freerunner.


    Jetzt stehe ich gerade vor der Herausforderung, das Gerät mit meinem Mac (OS 10.7.2) zu verbinden und meine Programme da rauf zu bekommen.
    Trotz aller Aktivitäten gemäß des Tutorials bekomme ich keine Verbindung zu Stande.
    adb devices findet ausschließlich den Emulator, wohingegen das System den Freerunner auf irgendeine Art und Weise definitiv erkannt hat.


    Hat da jemand Erfahrungen und kann mir irgendwie weiterhelfen?

    Nein, "Moin" heißt nicht "Guten Morgen". ;)


    Eigentlich bin ich in der Welt um Objective-C und Cocoa zu Hause.
    Da aber aus irgendwelchen mir noch nicht so ganz ersichtlichen Gründen Android-Geräte einen gewissen Marktanteil haben und ich schon seit G1-Zeiten ein Open-Source-Bastelsmartphone besitze dachte ich mir, ich schau mir das Ganze mal von der Codeseite her an.


    Die Dokumentation der UI-Elemente lässt meiner Meinung nach noch sehr zu wünschen übrig, insofern müsst ihr vermutlich die ein oder andere dämliche Frage zu einigen Designkonzepten ertragen.


    Viele Grüße und auf ein angenehmes Miteinander!