Der Dokumentation entnehme ich, dass also nur Strings gehen und der Weg mit der Umwandlung der richtige ist.
Danke, auch für das Tutorial.
Beiträge von Marco Feltmann
-
-
Hi Titus,
leider nein.
Zitat10-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)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.
Zitat10-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.PreferenceJau, 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? -
Verstehe ich das richtig, dass es da keine Methode graphic.isEqualTo(anotherGraphic) gibt?
-
-
Danke für den Tipp!
Das mit dem EditItem.this... ist ja kurios.
Nur this gibt die Methode onClickListener wieder. Das muss einem aber erst mal auffallen. -
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.Javapublic 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:
Java
Alles anzeigenconfirmButton.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Bundle bundle = new Bundle(); bundle.putString(ShoppingListDatabaseHelper.ITEM_KEY_NAME, nameTextField.getText().toString()); Intent defaultIntent = new Intent(); defaultIntent.putExtras(bundle); finish(); } });
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... -
Danke für die Antworten, ich werde vor Allem das Schließen des Zeigers berücksichtigen.
-
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)
Java
Alles anzeigen/* ListActivity Subclass, relevante Codezeilen */ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { /* Tell superclass to do it's initialization stuff */ super.onCreate(savedInstanceState); /* Take the item list view as content view for this list activity */ setContentView(R.layout.itemview); registerForContextMenu(getListView()); reloadData(); } /** Context menu to delete an item */ @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.add(0, EDIT_LIST_ITEM_ID, 0, R.string.edit_item); menu.add(0, DELETE_LIST_ITEM_ID, 0, R.string.delete_item); } @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case EDIT_LIST_ITEM_ID: return true; case DELETE_LIST_ITEM_ID: AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); dbHelper.deleteItem(info.id); reloadData(); return true; default: return super.onContextItemSelected(item); } } public void reloadData() { Cursor dataCursor = dbHelper.fetchItems(); startManagingCursor(dataCursor); String[] databaseValues = new String[] { ShoppingListDatabaseHelper.ITEM_KEY_NAME }; int[] views = new int[] { R.id.item_name }; SimpleCursorAdapter itemsCursorAdapter = new SimpleCursorAdapter(this, R.layout.item_row, dataCursor, databaseValues, views); setListAdapter(itemsCursorAdapter); }
HTML
Alles anzeigen<!-- itemview.xml --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:drawSelectorOnTop="false"/> <TextView android:id="@android:id/empty" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="@string/no_items_stored"/> </LinearLayout>
HTML
Alles anzeigen<!-- item_row.xml --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <TextView android:id="@+id/item_name" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="Item Name" /> </LinearLayout>
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 imHTML
Alles anzeigen<!-- item_row.xml --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <ToggleButton android:id="@+id/toggleButton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ToggleButton" /> <TextView android:id="@+id/item_name" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="Item Name" /> </LinearLayout>
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?
-
Ah, stimmt.
Gut, da hab ich nur den Einen und daher nix zu befürchten. -
Komisch, bei mir (API 7) heißen die noch
drawable-hdpi
drawable-mdpi
drawable-ldpiAlso High-/Medium- und Low-DPI.
Sehr konsequent. Naja, Hauptsache es passt insgesamt.
-
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. -
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:
Code
Alles anzeigenLokale dataID's sammeln, bei denen _synchronised=0 gilt Remote dataID's sammeln, Aufruf http://www.meinServer.de/sqlapi/dataIDs Beide ID-Listen vergleichen und umsortieren: Kommt nur lokal vor: in Liste 'upload' Kommt nur remote vor: in Liste 'download' Kommt bei beiden vor: in Liste 'sync' Für jede dataID in Liste 'upload' Für jeden dazugehörigen Datensatz Aufruf http://www.meinServer.de/sqlapi/setData?dataID=id{z.B. 0815}&dataArray=data Lokalen Datensatz auf _synchronised=1 setzen Für jede dataID in Liste 'download' Für jeden dazugehörigen Datensatz Aufruf http://www.meinServer.de/sqlapi/data?dataID=id{z.B. 0815} Lokalen Datensatz mit den Werten des Resultats erstellen und _synchronised=1 setzen Für jede dataID in Liste 'sync' Für jeden dazugehörigen Datensatz: Aufruf http://www.meinServer.de/sqlapi/compare?dataID=id{z.B. 0815}×tamp=ts(z.B. 1329214099} Teste Resultat Veraltet: Aufruf http://www.meinServer.de/sqlapi/data?dataID=id{z.B. 0815} Lokalen Datensatz mit den Werten des Resultats aktualisieren und _synchronised=1 setzen Break; Neuer: Aufruf http://www.meinServer.de/sqlapi/setData?dataID=id{z.B. 0815}&dataArray=data Lokalen Datensatz auf _synchronised=1 setzen Break;
-
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.Zitat
Mac-mini:platform-tools ldv$ sudo ./adb devices
List of devices attached
emulator-5554 device---
RNDIS/Ethernet Gadget:BSD-Name: en3
Produkt-ID: 0xa4a2
Hersteller-ID: 0x0525 (PLX Technology, Inc.)
Version: 3,12
Geschwindigkeit: Bis zu 12 MBit/s
Hersteller: Linux 2.6.32.21-mokodev with s3c2410_udc
Standort-ID: 0xfa120000 / 5
Verfügbare Stromstärke (mA): 500
Erforderliche Stromstärke (mA): 500Hat 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!