Beiträge von UweApps

    Zu empfehlenswerten Büchern gab es neulich schon eine kleine Diskussion...


    Und du musst dich gar nicht auf eine Version festlegen. Du kannst im Manifest mit targetSdkVersion die "Wunschversion" angeben, aber mit minSdkVersion zusätzlich ältere Versionen zulassen, dann musst du aber Features, die in älteren Versionen nicht funktionieren mit if oder ähnlichem ausklammern. Deine Apps laufen aber auf jeden Fall auch auf Geräten mit Android-Versionen nach der targetSdkVersion.


    Eher früher als später wirst du zusätzlich die Doku von Android nutzen, dort steht überall die Versionsnummer drin, die mindestens erforderlich ist. Aber die meisten interessanten Sachen sind seit 2.0 schon dabei.


    Bücher beziehen sich im Titel gerne auf Versionsnummern, damit man zu jeder Version wieder ein neues Buch veröffentlichen kann, die Unterschiede sind aber nicht wirklich groß...

    na gut - weil du's bist... B-)



    Ein bisschen anpassen musst du dann aber noch. Und die -1 ist sehr gut, weil dann klar ist, das gar keine Position vorhanden war - du darfst aber auch gerne 0 eintragen, um die Defaultpostion 0 zu bekommen.

    so, hab 'ne Weile rumgesucht - das was ich vorher geschrieben hatte, war leider völlig irreführend. ;)


    Mit einem HorizontalScrollView um dein TabWidget und den richtigen Einstellungen zur Breite sollte es funktioneren:

    HTML
    <HorizontalScrollView
     android:layout_width="fill_parent"
     android:layout_height="wrap_content" >
        <TabWidget
               android:id="@android:id/tabs"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content" />
    </HorizontalScrollView>

    Jetzt kommen wir der Sache anscheinend näher: du willst was vom Internet laden und fürchtest den Verbindungsabbruch?


    Das Unterbrechen passiert nicht unerwartet - dafür gibt's normalerweise eine IOException oder so beim Netzwerkzugriff - oder nicht?


    Keine Exception => kein Ladefehler - so ist zumindest der Grundgedanke. Du kannst dann also direkt weiterarbeiten...


    Und willst du immer wieder laden oder vielleicht nach drei erfolglosen Versuchen erst mal 5 Minuten Pause einlegen?

    Wenn das Handy aus ist, dann geht's eher nicht. Dann müsstest du es erst einschalten, so viel wollen wir schon mal festhalten.


    Und so was kann dann nur zeitgesteuert funktionieren - eine gute Wecker-App sollte das ja auch können... B-)


    Wenn du möchtest, dass etwas weiterläuft, auch wenn die Activity vom Schirm verschwindet, kommst du um 'nen Service nicht herum. Und BroadcastReceiver wird dann auch nötig sein, denn den Systemstart wirst du dem Handy überlassen müssen.


    Es gibt für's Manifest android.permission.DEVICE_POWER und android.permission.BRICK - aber die wohl eher zum ausschalten. Wahrscheinlich wirst du irgend einen Service von Android finden müssen, der das Gerät einschaltet und dir eine Broadcast Message zuschickt.

    Vielleicht solltest du deinem Poll-Thread eine fireUp und shootDown (oder wie auch immer *g*) spendieren, mit der du die boolean-Variable hinter einem Funktionsaufruf versteckst. Aber ich kann killphil nur zustimmen, du solltest die boolean wirklich behalten...


    Mit den Methoden kannst du dann auch den Thread erst mal beenden (vielleicht passiert da ja noch was, was du aufräumen möchtest), bevor du die Verbindung kappst.


    sleep() ist ja leider etwas unkontrolliert - dafür vielleicht einen SleepHandler basteln, der sich mit sendMessageDelayed regelmäßig in den Hintern treten läßt und zum Beenden einfach removeMessage aufruft.

    In dem Beispiel wird ja eine Klasse gebaut, die jeweils String und int enthält.


    Und das Beispiel enthält eine main() - die solltest du unter Android nicht verwenden.


    Bei einer Activity ist onCreate() die bessere Stelle (und zwar außerhalb von der Beispiel-Klasse User), um deine Daten in die Objekte zu packen.


    Zeig doch mal deinen Code, dann können wir das besser analysieren. ;)

    Hallo Colt,


    kannst du bitte auch noch mal testen, was passiert, wenn deine XML-Datei im Text die schönen Zeichen < & " enthält - die können einem nämlich später echt Ärger bereiten.


    Dann hast du einen schönen Text für die Tutorials zusammen! :*


    Dazu kann ich dann nämlich eine Ergänzung schreiben: bei mir war das Problem, dass ich an der Serverseite nichts machen konnte, aber wenigsten sauberes XHTML bekommen habe - die Umwandlung der Umlaute hab ich dann in der App gemacht.

    Wenn du nur zwei Zeilen brauchst, gibt's auch eine fertige Vorlage von Android, aber da du schon ein eigenes Layout hast, hier mal ein paar Code-Schnipsel für dich.


    Zunächst brauchst du eine Datenstruktur für die Sachen, die du jeweils einbauen willst ("Datensatz"). Du kannst dir dafür entweder eine eigene Klasse bauen oder HashMap<String, String> benutzen, die ist zwar nicht so gut an deine Daten angepaßt, ist aber manchmal flexibler...
    Dein Vorschlag mit zwei Arrays geht zwar auch, finde ich aber nicht so gut, weil eine eigene Klasse für jeden einzelnen Datensatz dann doch etwas intelligenter aussieht. 8)

    Java
    private class Datensatz {
    	public String name;  // besser private und getter-Methoden schreiben, stört hier aber...
    	public String datum; // die Umwandlung von Datum lasse ich weg - frag das noch mal extra. ;)
    	public Datensatz(String name, String datum) {
    		this.name = name;
    		this.datum = datum;
    	}
    }


    Die Datensätze packst du dann in eine ArrayList, diese benutzt dann der Adapter, um die einzelnen Views zu erzeugen (vor Erzeugung des Adapters aufrufen - siehe unten):

    Java
    private ArrayList<Datensatz> datensaetze;
    private void initDatensaetze() {
    	datensaetze = new ArrayList<Datensatz>();
    	for (int i=0; i<nameArray.length; i++) {
    		datensaetze.add(new Datensatz(nameArray[i],datumArray[i]));
    	}
    }


    Nun kommt der Adapter, der dem ListView die einzelnen ListItems auf Anfrage liefert. Der Adapter muss auch ein getCount liefern, damit ListView weiß, wann Schluss ist. Außerdem braucht man meistens auch einen OnItemClickListener (dann dürfen die Items aber selber keine OnClickListener implementieren!)


    So, nun der krönende Abschluss: einbinden in deinen ListView:

    Java
    ListView l = (ListView) findViewById(R.id.listView1);
    initDatensaetze();
    MyItemAdapter myAdapter = new MyItemAdapter();
    l.setAdapter(myAdapter);
    l.setOnItemClickListener(myAdapter);


    so, jetzt hab ich glaub ich alles zusammen - leider muss man sich das aus verschiedenen Quellen zusammen sammeln und Anfänger haben da manchmal zu viele lose Enden in der Hand. Aber hiermit solltest du schon mal klar kommen - Erweiterungsmöglichkeiten sind vor allem in Datensatz und bindView sinnvoll, je nach Quelle der Daten ist initDatensaetze auch einfach anzupassen.


    Fehler und Verbesserungsvorschläge willkommen, dann kommt dies Ding auch in die Tutorials. :D

    Du kannst es mal versuchen - und schreib, ob es geklappt hat. Vielleicht hat Eclipse da auch eine Einstellung, frag mich aber nicht, wo die sein könnte...


    Ansonsten lege dir in Eclipse ein neues Projekt an für API 14 und kopiere dann deine Dateien in das neue Projekt.


    Dabei gibt's zwischendrin immer mal wieder den Fehler, dass Eclipse einige impoorts am Anfang einträgt für das alte Projekt, einfach löschen und weitermachen...

    Doku sagt, showAsAction gibt's ab API 11 - also sollte es mit target 12 auf jeden Fall funktionieren. Versuchs mal...


    Sonst schau auch noch mal, was Eclipse für eine Version in der Datei project.properties definiert hat - da steht (hoffentlich) target=android-12 - passend zum Manifest.


    Im Code musst du aber dem Benutzer älterer Version die Funktionalität vielleicht auch irgendwie anbieten, da kannst du die if-Abfrage in abgewandelter Form benutzen...

    minSdkVersion muss kleiner als targetSdkVersion sein - anders gesagt, du willst Code schreiben, der Features von targetSdkVersion benutzt, aber es soll auch laufen auf 'nem Gerät mit minSdkVersion - dann allerdings mit weniger Funktionen (du musst die kritischen Abschnitte ausblenden).


    In deiner Manifest.xml sollte in etwa folgendes stehen:

    HTML
    <uses-sdk android:minSdkVersion="5" android:targetSdkVersion="12" />


    Im Code kommt dann so was:

    Java
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
    	// was wunderbares machen
    } else {
    	// tröstende Meldung an den Benuter ausgeben
    }


    Die Versionsnummern an deine Wünsche anpassen. 8)

    Das Semikolon stört nicht - ist nur ein leerer Befehlt (es geht auch ;;; - das waren mehrere leere Befehle).


    Ich hätte da noch die Frage, was "in" für ein Objekt ist - und bekommst du irgendwelche Fehlermeldungen??


    Den while würde ich lieber etwas entspannter schreiben:

    Java
    while (in.hasSomethingMoreToOffer()) {
        zeile = in.nextLine();
        ....

    Hier gibt's ja auch noch keine Antwort. Wird mal Zeit...


    Zunächst als erstes - du brauchst das Verzeichnis gar nicht zu speichern, du kannst es ja jedes mal neu ermitteln lassen. Du musst sowieso nachschauen, ob die SD-Karte überhaupt noch eingelegt ist - die kann man auch rausnehmen...


    Aber im folgenden Code findest du auch bestimmt die richtige Stelle, um das Verzeichnis zu speichern (btw. da du wahrscheinlich später die Pref mit Uri.parse nutzen wirst, speichere gleich den String "file://" + myFile.toString() in den Prefs, den erkennen auch einige andere Methoden gleich als Uri und parsen automatisch).


    Der Königsweg für Zugriff auf die SD-Karte (hier für Foto-Verzeichnis - da gibt's nämlich zusätzliche Besonderheiten) ist folgender:


    In der Manifest.XML eintragen:

    HTML
    <uses-sdk android:minSdkVersion="5" android:targetSdkVersion="12" />
    <uses-feature android:name="android.hardware.camera" android:required="false" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


    Durch die targetSdkVersion bekommt ihr Zugriff auf getExternalPublicDirectory (ab Froyo), erlaubt aber auch ältere Versionen, ich glaube, es geht sogar ab 3.


    Entsprechend sieht der Code, der sich um das Speicherverzeichnis (und die Aufnahme des Fotos) kümmert, folgendermaßen aus (den Rest der Activity habt ihr hoffentlich schon selber irgendwie gebaut...):


    So, das wollte ich mal loswerden, weil ich das alles aus vielen verschiedene Quellen zusammengesucht hab, und mir irgendwie keine wirklich gute Doku untergekommen ist.


    Sollte jemand 'nen Fehler finden, bitte melden. Verbesserungen bitte auch. Vielleicht landet das ja auch mal in den Tutorials...

    Mal ein altes Thema, aber muss ja auch mal beantwortet werden.


    Sollte euch so etwas passieren, einfach mal folgendes kontrollieren: im Browser den Market öffnen, dort einloggen (damit Kompatibilität mit eurem Gerät geprüft wird) und dann die App suchen - dann wird (bei deiner App auch für mich) angezeigt, dass sie nicht mit meinem Gerät komplatibel ist.


    So etwas liegt eigentlich immer an Einstellungen, die in der Manifest.xml eingetragen sind. Oftmals ist die Bildschirmauflösung ein Problem, es gibt halt auch Android-Gerät mit großen Pixeln...


    Wenn ihr viele Geräte erreichen wollt, dann probiert sie auch in verschiedenen AVDs aus - der Market wird's euch danken.

    Erste Idee wäre, den Focus an den entsprechenden Child-View abzugeben, viel mehr Möglichkeiten sehe ich nicht in der Doku zum ScrollView. Aber ich hab's nicht probiert.


    Vielleicht liefert dir die Doku zu Gestures auch noch Informationen - da gibt es nämlich die Besonderheit, dass eine Gesture, die nur vertikal ist, nicht erlaubt ist (wegen scrolling). Aber ein Plus-Zeichen ist möglich - das funktioniert dann aber nur, wenn vorübergehend das Scrolling aufgeschoben wird, und das macht die Gestenerkennung.


    Aber jetzt fang nicht an, und versuche Gesten zu implementieren - das passt wahrscheinlich nicht zu deinem Anwendungsfall. ;)