Beiträge von matthias

    Hi,


    ich habe keine Antwort auf deine Frage, nur eine Gegenfrage: warum willst du dich von deinem Android Device auf eine MySQL Datenbank verbinden?


    Der bevorzugte Weg ist dies über eine Client-Server-Kommunikation abzuwickeln und nur der Server hat eine Verbindung zur MySQL Datenbank. Im Normalfall schickt man einen HttpPost an den Server, der die Anfrage verarbeitet, mit der Datenbank kommuniziert und dann einen Request liefert. Hier ein Tutorial -> Apache Http Client



    Gruß,
    matze

    Hi,


    ich benutze immer einen OnItemClickListener. Strukturell baue ich immer eine eigene Klasse ListItemAdapter die von BaseAdapter erbt und eine ArrayList mit ListItems bekommt. Ein ListItem ist eine ganz einfach gehaltene Bean, die einfach nur ihre Values per getter und setter hält.
    In der onCreate der Activity, die für die ListView zuständig ist, setze ich dann den Adapter und den OnItemClickListener. Ich lasse meistens den Listener von der gleichen Activity implementieren.

    Java
    adapter = new ListItemAdapter(this, listViewItems);
    		ListView lv = (ListView) findViewById(R.id.listView);
    		lv.setOnItemClickListener(this);
    		lv.setAdapter(adapter)


    Die Instanz adapter merke ich mir als Membervariable, um in der onItemClick dann bequem das richtige ListItem auszulesen

    Java
    @Override
    	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    		ListItem item = (ListItem) adapter.getItem(position); 
    		// TODO: do something
    	}


    Schaut vielleicht im ersten Moment etwas viel Aufwand für einen lächerlichen Click aus, finds strukturell aber eigentlich recht übersichtlich und elegant.


    Gruß,
    matze

    Hi nemesis,


    stimmt, es lassen sich nur primitive Datentypen in die SharedPrefenreces schreiben. Es gibt Möglichkeiten wie das JSONObject um Objekte dann mit .toString() abzulegen oder Arrays indem man den Index an den Key hängt.
    Allerdings wäre es dann schon sauberer das ganze über eine SQLite DB zu machen.


    Wenn ich dich richtig verstehe wäre die HashTable oder HashMap das was du suchst, ja. HashTable wenn es Thread-Sicher sein soll oder eine deiner Values null sein kann. Ansonsten natürlich die HashMap, da die keine synchronized methoden hat und somit effizienter ist.


    Gruß,
    matze

    Hi nemesis,


    zur Thematik letzten Datensatz wieder verwenden oder einen neuen anlegen fällt mir spontan das Stichwort SharedPreferences ein. Im Grunde eigentlich eine Hashtable in die man Key-Value-Pares werfen kann. Um den Dateizugriff usw. braucht man sich dann nicht weiter kümmern. Du könntest also auf ein Beenden deiner App reagieren, das aktuelle Objekt in den SharedPreferences ablegen und bei einem Neustart je nachdem was der User wählt und will das aktuelle Objekt wieder auslesen oder verwerfen.


    Gruß,
    matze

    Hi Titus,


    vielen Dank für den Tipp. Schaut schön übersichtlich aus und mit allen Verlinkungen zum Market die man so braucht. Gefällt mir.


    Gruß,
    matze

    Hi Lisa,


    meine spontane idee:
    man braucht einen server (apache2, php) und eine datenbank (mysql o.ä.). von der app aus wird beim start oder aktualisieren des schwarzen brettes ein httppost an den server geschickt. die app bekommt als antwort eine xml datei, die gut durchdacht nach kategorien, darunter die einzelnen beiträge mit titel, datum, ersteller, text usw ausgestattet ist. die parst man dann (saxparser findet man überall) und baut seine ListView auf. übersicht kategorien und darunter dann die ganzen einträge ....


    zum eintragen oder löschen könnte man mit curl ein formular auf dem server ausfüllen und versenden o.ä. hätte den praktischen vorteil dass man gleich noch das ganze vom pc aus im browser machen kann, wenns einem mal zu blöd wird das ganze mit dem handy einzutragen. bearbeiten wäre ähnlich wie anlegen, nur dass er sich vorher nochmal die aktuellen daten vom server holen muss, indem er z.b. einem anderen formular die id schickt und bekommt dann den content. könnt ja das gleiche formular wie bei neu sein mit hidden field id wenn ausgefüllt isses n update wenn nich n insert in die datenbank.


    benutzerverwaltung bräuchts dann auch, soll ja nicht jeder einfach meinen eintrag löschen können ....


    falls das ganze jetzt etwas zu wirr daher geschrieben war (die idee wächst und wächst mit dem schreiben :D) gib einfach bescheid.



    gruß,
    matze

    Hi,


    mein Wissen auf dem Gebiet ist nicht sehr umfassend, jedoch erinnere ich mich an einen anderen Beitrag, den ich mal wo gelesen habe.
    Grundsätzlich kommt es drauf an was für eine App du eigentlich entwickelst. Wenn du jetzt eine Sudoku App baust gibt es nicht viel zu verklagen, was will man da tun?
    Wenn du eine Navigations-Software baust schauts anders aus. Wenn irgend ein dau mitten in den Fluss fährt, weil deine App es ihm befohlen hat wirds wohl dann etwas kritisch.


    Ich finde bei sowas sichert man sich am unkompliziertesten ab, wenn man dem Benutzer beim ersten Start einfach AGBs vorsetzt die er akzeptieren muss, sonst kann er die App halt nicht benutzen. Wenn er akzeptiert was da drin steht, ach wenn es wahrscheinlich niemand liest, kann er dir eigentlich nicht mehr an, wenn die AGBs gut geschrieben sind.


    Auf jeden Fall ein wichtiges Thema, falls du auf anderem Wege als hier noch ergänzende Informationen in Erfahrung bringst würde ich dich bitten sie uns mitzuteilen ;)



    Gruß,
    matze

    Hi,


    vielleicht liegt es auch einfach nur an der Reihenfolge, die bei einem Java-Projekt etwas anders ist als bei einem Android Projekt. In einem Java-Projekt wird die Main der Klasse aufgerufen, die du in den Run Configurations gewählt hast (bzw. automatisch von Eclipse, wenn es nur eine main gibt). Wenn du dort drin dann Membervariablen der Klasse initialisierst fliegt keine NullPointerException.
    In einem Android-Projekt ist ja die "main" die onCreate Methode, die in der AndroidManifest.xml als Main ausgewiesen ist (besitzt einen intent-filter mit dem Eintrag <action android:name="android.intent.action.MAIN" />). Wenn du dort nun auf Variablen zugreifst, die erst in der "Java-Projekt-Main" initialisiert werden, knallts natürlich.


    Vielleicht hilfts dir ja weiter ;)


    Gruß,
    matze

    Hi Leute,


    ich würde gerne in einer WebView eine Website anzeigen, die nicht mir gehört. Auf dieser Website befindet sich eine mit jQuery realisierte Slideshow. Firebug sagt konkret jquery-1.3.2.min.js und jquery-ui-1.7.2.custom.min.js.
    Im Android Standard-Browser und in Chrome Beta funktioniert die Slideshow, nur in meiner WebView tut sie das nicht.


    Ich hab mich mit verschiedensten Einstellungsmöglichkeiten gespielt und unter anderem hardwareAccelerated auf true gesetzt, Plugins enabled, den PluginState auf On gestellt und setAllowFileAccess auf true. JavaScript ist auch aktiv. Alles etwas zusammen gewürfelt, das Resultat von einiger Zeit googeln -.-


    Nun wende ich mich mit meinen letzten paar Nerven zu dem Thema an euch, in der Hoffnung dass mir jemand den entscheidenden Brotkrumen zuwirft. Hat jemand eine Idee?



    Gruß,
    matze


    EDIT:


    also es funktioniert jetzt. Letztendlich habe ich nach einigem min und target SDK herumstellen bemerkt, dass meine Zeile

    Java
    settings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);


    als deprecated markiert ist. Hab sie auskommentiert und siehe da, es geht. Ob das jetzt allerdings der ausschlaggebende Punkt war kann ich echt nicht sagen.
    Folgenden Code habe ich
    [Java]
    // Skalierung der Seite setzen
    wv.setInitialScale(Tools.getScale(this));
    wv.setPadding(0, 0, 0, 0);

    WebSettings settings = wv.getSettings();
    settings.setDefaultTextEncodingName("UTF-8");
    settings.setPluginsEnabled(true);
    settings.setPluginState(WebSettings.PluginState.ON);
    settings.setAllowFileAccess(true);
    settings.setAllowContentAccess(true);

    // Ansicht hochkant starten
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


    // Websites enthalten Javascript, ohne geht das Scrollen nicht mehr
    settings.setJavaScriptEnabled(true);


    // Online-Seiten sollen scroll und zoombar sein
    settings.setBuiltInZoomControls(true);
    wv.setHorizontalScrollBarEnabled(true);

    // Website in sichtbaren Bereich einpassen
    settings.setUseWideViewPort(true);
    // settings.setLoadWithOverviewMode(true);
    //settings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);

    // URL laden
    wv.loadUrl(location);
    [/Java]


    Die Tools.getScale(this) sieht so aus:
    [Java]
    /**
    * calculates the scale for the webview content
    * @param context Context
    * @return int
    */
    public static int getScale(Context context) {
    if (context == null) return 0;
    Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    int width = display.getWidth();
    Double val = Double.valueOf(width) / Double.valueOf(Const.WEBWIDTH); // Const.WEBWIDTH hat den Wert 638, ist nur der Übersicht und Sauberkeit halber ausgelagert
    val = val * 100d;
    return val.intValue();
    }
    [/Java]
    Des Weiteren habe ich in der AndroidManifest dem <application> Tag

    Code
    android:hardwareAccelerated="true"


    hinzugefügt. Hierzu habe ich meien minSdk auf 9 und meine targetSdk auf 14 gestellt. Irgendwo steht zwar, dass hardwareAccelerated erst ab 11 geht, habs aber auf nem Gerät mit Android 2.3.4 getestet, das die SdkVersion 9 oder 10 haben müsste. Funktioniert dort auch einwandfrei. Zumindest wirfts keinen Fehler ;)


    Falls jemandem noch Verbesserungen auffallen oder ich noch mehr Code posten soll einfach bescheid geben.


    Gruß,
    matze

    Hi,


    hab hier drin nur Edge und es macht gefühlt maximal 1 Sec unterschied. Aber so einen krassen Unterschied von 200ms -> 8 Sekunden hab ich bisher nicht hingekriegt. Vielleicht maximal wenn ich froh sein kann überhaupt irgendein Netz zu haben.


    Gruß,
    matze

    Hi,


    also mein Code, der etwas Ähnliches tut schaut ziemlich identisch aus. Bei mir dauert das ganze nur einen Bruchteil einer Sekunde ...
    Kommt halt auf das Handy selbst an, wie gut ist die Antenne da drin, wann schickt der die Anfragen überhaupt los, welchen Empfang hast du, was für ein Netz hast du .... Ist natürlich ärgerlich, wenn sowas lange dauert.
    Zum anderen kommts natürlich auch auf den Server an, aber wenns nur 300 Byte sind dürfte der vernachlässigbar sein ...
    Ich denke man kann da tatsächlich nicht viel tun, falls du doch noch über etwas stolperst gib uns aber bitte bescheid ;)


    Gruß,
    matze

    Javadoc:

    Zitat

    public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)


    Dein Wert für "orderBy" ist null, also nein. Kann natürlich trotzdem mal rein zufällig "richtig sortiert" raus kommen.

    Hi,


    mach doch bitte mal die Java BB-Code Tags um deinen Code, dann sieht man auch bisschen mehr.
    Ansonsten, wie Kogoro schon frage, was sagt der LogCat?


    Gruß,
    matze

    Hi,


    also Erfahrung mit verschiedensten Webservices hab ich jetzt nicht, allerdings hindert mich das ja nicht, von meiner einzigen Erfahrung zu berichten ;)
    Ich reagiere in einer meiner Projekte auf eine Push Message und schicke darauf hin einen HTTP Post an ein PHP-Script. Das gibt mir dann JSON als Antwort, das dann weiter verarbeitet wird ....
    Funktioniert eigentlich ziemlich unkompliziert und schnell. Also von klick auf einen Button -> View-Wechsel -> HTTP Post -> Holt was aus einer MySQL DB -> JSON zusammen bauen -> JSON schicken -> JSON empfangen -> verarbeiten -> in eine ListView ausgeben vergehen vll. 2 Sekunden wovon das meiste der Aufbau der Oberfläche ist.
    Was man so liest bin ich auch nicht der einzige, der das so macht. Vielleicht hilfts dir ja was ;)


    Gruß,
    matze

    Hi,


    hab ich auch übersehen :D und weil dann das UTF-8 gefehlt hat wollte er es mit dem Browser-Standard (meistens iso) darstellen, verständlich.
    Naja freut mich für dich, dass es nur sowas triviales war. Mit dem Thema kann man sich grün und blau ärgern ....


    Gruß,
    matze

    Hi,


    Deswegen benötige ich keine Schleife


    Glaub ich kann dir nicht ganz folgen. Du änderst da den Datensatz, den du verschieben willst und den Datensatz auf den du ihn schiebst schubst du eins weiter runter. Aber da eins weiter drunter kann doch nochmal was sein?
    Ich denke schon, dass du eine Schleife brauchst. Dann stellt sich die frage wie viele Datensätze du da hast, denn deine Variante wird wie KuJo schon sagte schnell alles andere als performant.


    Gruß,
    matze

    Hi,


    ich gehe mal davon aus, dass deine Umlaute vor dem Anzeigen in der WebView, also wenn er den HTML Code zusammen bastelt, noch nicht kaputt sind.
    Ist es eine Option für dich, die Umlaute mit String.replace einfach in die jeweiligen HTML-Tags zu wandeln? (ü -> ü usw.)


    Falls es was hilft, und ja ich weiß ist jetzt nicht das Schönste überhaupt, würd ich es auf jeden Fall machen. Encoding-Probleme sind ein sehr lästiges Thema, die WebView mindestens genauso. Die entsprechenden HTML-Tags dafür zu verwenden ist da noch das geringste übel finde ich.



    Gruß,
    matze