Nieuw: de Huawei Watch D2 nu met FreeBuds 5i t.w.v. €99,99 cadeau!

DevTutorial 6 – Je eigen class maken en deze vullen met JSON-gegevens

Wouter
5 oktober 2011, 20:30
21 min leestijd
DevTutorial 6 – Je eigen class maken en deze vullen met JSON-gegevens

Lees verder na de advertentie.

Hierdoor heb je na deze zesde DevTutorial een aardige basis wat Androidkennis betreft. Concepten die je daarna gaat leren kan je nu makkelijker begrijpen. Dit doordat je ze kan verbinden met de andere concepten die je daarvoor geleerd hebt. Om deze reden zijn DevTutorials nummer zeven tot en met tien kleinere DevTutorials.

Wat gaan we doen

In de vorige tutorial hebben we de gebruikersgegevens van een Twitter-gebruiker weergegeven in een TextView. Het probleem was echter dat er allemaal coderingstekens doorheen stonden en waarden die je eigenlijk helemaal niet wil laten zien aan de gebruiker. In deze DevTutorial gaan we de ruwe JSON-gegevens inlezen zodat ze gescheiden getoond kunnen worden in je app. Ook wordt de gedownloade gebruikersnaam gebruikt om een tweede Activity te starten die we gaan gebruiken in de volgende DevTutorial. Terwijl je deze dingen maakt ga je de volgende onderwerpen bij langs:

Het downloaden en het tonen van de tweets van de Twitter-gebruiker doen we in DevTutorial zeven. De hoofdgedachte van deze DevTutorial is dat je een nieuwe class maakt voor het opslaan van gegevens die je downloadt vanaf een specifieke internetpagina. Als je ergens niet uitkomt kan je hier op het een vraag stellen. Veel succes ermee!

De app verder ontwerpen

De layout uit de vorige DevTutorial heeft een TextView, waar alle JSON-sourcecode in gegooid werd. Straks hebben we een app waarin we apart de gebruikersnaam en de website van de Twitter-gebruiker kunnen opvragen, dus het is netter om twee aparte TextViews hiervoor aan te maken. Ook gaan we twee extra TextViews aanmaken, die als titeltekst dienen voor de gebruikersnaam en de website (bijvoorbeeld ‘Username:’ en ‘Website:’). Voor het aanpassen van de layout wordt uitgegaan van de layout uit het bestand nicelayout.xml, die je als extra oefening in de vorige DevTutorial hebt gemaakt. Hiervoor moeten de volgende bestanden in jouw Androidproject gelijk zijn aan de mijne:

Wil je toch de de layout uit het bestand main.xml gebruiken, dan kan dat ook, alleen moet je dan de Style properties van de TextViews leeg laten (in plaats van daar @style/text_p in te vullen). Verwijder de volgende views:

Sleep de volgende views via het Outline Window in relativeLayout1

Je layout ziet er nu als volgt uit (inclusief de ids die je in het Outline Window kan zien): .

ElementPropertyWaarde
txtvUserNameTitle Layout below @+id/btnDownload
txtvUserNameTitle Layout margin top 10dip
txtvUserNameTitle Text Username
txtvUserNameTitle Style @style/text_p
txtvUserName Layout align baseline @+id/txtvUserNameTitle
txtvUserName Layout align parent right true
txtvUserName Style @style/text_p
txtvUrlTitle Layout below @+id/txtvUserNameTitle
txtvUrlTitle Layout margin top 10dip
txtvUrlTitle Text Website
txtvUrlTitle Style @style/text_p
txtvUrl Layout align baseline @+id/txtvUrlTitle
txtvUrl Layout align parent right true
txtvUrl Style @style/text_p
btnTweets Layout below @+id/txtvUrlTitle
btnTweets Layout align left @+id/btnDownload
btnTweets Layout align right @+id/btnDownload
btnTweets Layout margin top 10dip
btnTweets Clickable true
btnTweets On click showTweets

Je layout moet er nu als volgt uitzien: . Nu moet je class MainActivity aangepast worden:

Je class moet er nu als volgt uitzien: [gist id=1048664]

De app verder programmeren

Het doel van deze DevTutorial is om in plaats van de gedownloade rommelige tekst, alleen de gebruikersnaam en de url van de Twitter-gebruiker te laten zien op een nette manier. Om dat te kunnen doen heb je net al vier TextViews toegevoegd, waarvan er nu twee gevuld moeten worden met de juiste gegevens. Om dit op een nette manier te vullen, heb je twee methods nodig die je de gebruikersnaam en de website van de gedownloade Twitter-gebruiker geven. Zoals je weet, bestaan deze methods niet standaard in Android en zul je deze zelf moeten maken. Het netste is om hiervoor een nieuwe class aan te maken, met bijvoorbeeld de naam TwitterUser. Nadat je deze class hebt gemaakt, moet je ervoor zorgen dat je hem kan vullen met  de gedownloade gegevens én dat je de gegevens via methods gescheiden kan uitlezen. Het maken van een nieuwe class gaan we doen door een nieuw .java-bestand te maken, waar we een class block inzetten met de naam TwitterUser. In deze class moeten sowieso twee methods komen die de gebruikersnaam en de website van de gedownloade Twitter-gebruiker kunnen teruggeven. Deze twee gegevens kunnen alleen maar worden teruggeven als ze kunnen worden onthouden door de TwitterUser class: er worden eerst de methods getUserName en getWebsite gemaakt en de Strings mUserName en mWebsite worden aangemaakt in het class block. Daarna maken we in deze class een constructor method, die je gaat gebruiken als je een nieuw Object van dit type (TwitterUser) aanmaakt in je code. Vervolgens zorgen we ervoor dat deze constructor method een extra bericht accepteert, namelijk de gedownloade gegevens van de Twitter-gebruiker. In deze constructor method wordt vervolgens dit extra bericht uitgelezen en gebruikt om de de gebruikersnaam en de website op te slaan. Wanneer je class TwitterUser af is, gaan we hem gebruiken in je class MainActivity.

Eigen class maken: TwitterUser

Wanneer je een nieuwe class wilt maken, moet je hiervoor een nieuw java-bestand maken dat eindigt op .java. In dat bestand beschrijf je eerst in welke package de class zit en daarna typ je het block van de class. Dit kan je laten genereren door met je rechtermuisknop in de linkerbalk van Eclipse op de package me.moop.mytwitter te klikken en dan op New –> Class te klikken. Dan krijg je dit scherm, waar je bij Name TwitterUser in moet vullen en vervolgens op Finish moet klikken om de class aan te maken. Als resultaat krijg je het bestand TwitterUser.java, met daarin een lege class TwitterUser: [gist id=1044755]

Methods en return types: getUserName en getWebsite

De class willen we uiteindelijk gaan gebruiken om de gebruikersnaam en de website van de gebruiker op te vragen. Voor het uitwisselen van gegevens tussen Objecten (in dit geval tussen een Object van het type MainActivity en een Object van het type TwitterUser), moet je methods maken en ze een naam geven. Daarna kunnen deze methods van de Objects worden aangesproken door andere Objects. Als je zelf methodnamen moet bedenken die te maken hebben met opvragen van gegevens, is er de ongeschreven regel dat je de naam van de method laat beginnen met het woordje get. Na het woordje get moet je een (erg) korte beschrijving geven van wat je wilt opvragen (met de eerste letter van het woord steeds met een hoofdletter) . Omdat wij de gebruikersnaam en de website van de gebruiker willen opvragen krijg je de methods getUserName en getWebsite. In de beschrijving van het method block (dat is dus de regel die je schrijft voordat je je block daadwerkelijk begint met een ‘{‘ ), moet je nog aangeven dat de method als antwoord een String teruggeeft. In het geval van getUserName bevat die String de Twitter-gebruikersnaam en in het geval van getWebsite bevat die String de inhoud van de url van de website van de gebruiker. Dit geef je aan door het type van het object vóór de naam van de method te zetten. Zoals je weet, is een String eigenlijk een object van het type String: dus je schrijft dan String getUserName en String getWebsite. Dáárvoor moet je nog het woordje public zetten: hierdoor zet je deze method ‘open’, zodat hij gebruikt kan worden door andere objecten (in plaats van dat deze method alleen door zijn eigen class gebruikt mag worden). Wanneer je weet wat voor type object een method teruggeeft (bijvoorbeeld een String) kan je ook zeggen: het return type van de method is een String.

[gist id=1044785] Als het ‘goed’ is zie je bij elke method een fout staan: ‘This method must return a result of type String’. Dit betekent dat je in de methods nog opdracht moet geven om een antwoord te geven. Die antwoorden moet je ergens vandaan halen. Je kan het beste in het block van je class twee Strings definiëren met de naam mUserName en mLastTweet. Dat is dus een niveau hoger dan de Strings definiëren in de code van je methods: dit heeft te maken met de scope van de variables, zoals je in DevTutorial 4 kon lezen. De Strings gebruik je vervolgens in de methods, om door middel van het woordje return ze als antwoord terug te geven aan het stukje code dat de methods aanroept.

Je class moet er nu als volgt uit zien: [gist id=1044812]

Constructor: een speciale method om je class aan te maken en als resultaat een object ervan terug te krijgen

Je hebt nu een class TwitterUser die je zou kunnen gebruiken in je code. Er is nog een klein probleempje:  hoe krijg je überhaupt het object (van het type TwitterUser) in je code zodat je ermee kan werken? Tot nu toe is het namelijk alleen nog maar een apart bestandje in je Androidapp-project in Eclipse. Dit kun je doen door een constructor te gebruiken: dat is een speciale method zonder naam. Wanneer je een method maakt met de volgende eigenschappen dan herkent Android die method automatisch als een constructor method:

Die constructor kun je dan aanroepen en dan zorgt Android ervoor dat je als resultaat van die method een nieuw object krijgt van dat type. De constructor kun je aanroepen door het woordje new te gebruiken gevolgd door de naam van de class. Stel wanneer je deze constructor zou maken in je class: [gist id=1044846] en vervolgens gebruik je deze code in je MainActivity class tijdens je app: [gist id=1044849] Dan heb je een object TwitterUser met de naam myTwitterUser in je class waar je dan vervolgens de methods getUserName en getLastTweet op kan gebruiken (net zoals bijvoorbeeld de DefaultHttpClient in de vorige tutorial).

JSON: een syntax om gegevens compact op te slaan

Als je de gegevens van een Twitter-gebruiker via twitter.com opvraagt krijg je een lap tekst terug waar de gegevens in verwerkt zijn. Deze manier van verwerken van de gegevens in een lap tekst kan op verschillende manieren, en Twitter doet dit via de JSON-notatie (een vrij populaire notatie). Hieronder zie je een voorbeeld van de JSON die je terug kunt krijgen van twitter: [gist id=1044937] Deze gegevens beginnen met een ‘{‘ en eindigen met een ‘}‘ (scroll anders even helemaal naar rechts). Daar tussenin staan allemaal aparte gegeven en ze zijn van elkaar gescheiden door een komma (deze aparte stukjes noem je de elementen van de JSON). In zo’n element zie je steeds een woord (of meerdere woorden met een _ daartussen) tussen haakjes staan. Dat is de naam van het element van de JSON. Daarachter staat een dubbele punt en dáár weer achter staat de waarde van het element. In bovenstaande voorbeeld heb je dan het element is_translator met de waarde false en iets verderop heb je ook het element name met de waarde woutervegter (zoek het element name even op, dan raak je wat bekender met JSON – en dan onthoud je mijn naam ook beter :). Een JSON is dus een verzameling elementen waarbij elk element een naam heeft en een waarde die je uit kan lezen. Deze kennis gaan we gebruiken in de volgende paragraaf.

JSON: met JSONObject gegevens uitlezen

Het laatste probleem met je TwitterUser object, is dat hij nog niet gevuld kan worden met de juiste gegevens. Als je nu de methods getUsername of getWebsite zou aanroepen krijg je null als resultaat terug. Het vullen ervan kun je het beste doen in de constructor method: je weet namelijk al bij het aanmaken van het object welke gegevens er zijn waarmee het object gevuld moet worden. Die gegevens zitten in de elementen van de JSON. Wat je dan in de constructor moet doen is ervoor zorgen dat hij een String kan ontvangen waarin de JSON data zit.

[gist id=1044876] Om gegevens uit JSON uit te lezen kan je het beste de JSONObject class gebruiken. Deze class heeft onder andere de method optString waarbij je de stringwaarde van een element uit kan lezen. Nu moet het JSONObject aangemaakt worden. Kijk even naar deze pagina, kijk bij het kopje Public Constructors. Daar zie je alle constructors staan die bij deze class horen. Je ziet onder andere deze constructor staan: JSONObject(String json). Dat betekent dat er een constructor is die als parameter een String accepteert en op basis daarvan dus een JSONObject maakt. Zoals eerder uitgelegd kan je een constructor aanroepen met woordje new gevolgd door de class naam. Als parameter moet je dan de String meegeven die je wilt gebruiken voor het nieuwe JSONObject. Het aanmaken van een JSONObject kan exceptions veroorzaken als de JSON string die je gebruikt niet klopt. Daarom moet je het aanmaken en het gebruik van het JSONObject in een try catch block doen, waar je vervolgens een JSONException opvangt.

Nu heb je de volgende code: [gist id=1045028] Het JSONObject dat je jSONObject hebt genoemd kan je nu uitlezen en de waarden van de elementen wegschrijven naar mUserName en mWebsite. Daarvoor moet je de method optString(String name) gebruiken waarbij je als parameter de naam van het element mee geeft waarvan je de waarde wilt hebben.

Je class moet er nu als volgt uit zien: [gist id=1045050] Je eigen eerste class TwitterUser is nu klaar voor gebruik om er object van te maken van het type TwitterUser.

Variabele namen en class namen

Toen je de constructor method maakte en de method variabele intypte (JSONObject jSONObject) leek het misschien raar dat je twee keer bijna exact hetzelfde woord in moest typen. De reden om het zo te doen is dat class namen altijd beginnen met een hoofdletter waarbij elk woord in de naam van de class ook een hoofdetter krijgt (zo heb je dus ook TextView, EditText, LinearLayout enzovoorts). Variabele namen (in o.a. je class block, je method block of als method parameter) beginnen altijd met een kleine letter. Als je dan een variabele maakt van een class en het is de enige variabele, dan is het handig om de class naam te gebruiken als variabele naam, waarbij je de eerste letter als kleine letter schrijft. Omdat de naam van de variabele heel erg lijkt op de naam van de class dan weet je van wat voor type de variabele het is. En omdat de naam van de variabele met een kleine letter begint weet je altijd dat het om een variabele gaat. Er is nog een kleine uitbreiding op deze regel: als je een variabele aanmaakt in je class block dan laat je de naam altijd beginnen met de letter m (van het woord module). Hierdoor kan je altijd zien of je te maken hebt met een class variabele of met een lokale variabele (een lokale variabele is een variabele die in een method block of lager is gedefinieerd)

Views verbergen en tonen

Je wil het object van het type TwitterUser straks op meerdere plaatsen kunnen gebruiken:

Omdat dit in verschillende methods gaat plaatsvinden, kun je het beste een variabele van het type TwitterUser aanmaken in de scope van je class, dus in je class block.

[gist id=1257308] Van de views die we net hebben toegevoegd (vier TextViews en één Button), willen we ze kunnen tonen of verbergen afhankelijk van of er een twitter gebruiker is gedownload (dus of er wel of niet een TwitterUser object aanwezig is). Omdat de views afhankelijk zijn van één variabele (mTwitterUser), kun je het beste een nieuwe method om die variabele heen bouwen en die je scherm laten aanpassen.

Afhankelijk van de variabele mTwitterUser moeten de Views wel of niet getoond worden. Als mTwitterUser leeg is (dat betekent dat er geen gebruiker is) dan moeten alle Views verborgen worden, en als de parameter gevuld is moeten alle views getoond worden. Wanneer een object leeg is, dan heeft dat in Android een speciale naam: null. In programmeertaal moet je dan de vraag stellen: is de waarde van het object gelijk aan null? Dat kan je doen met een if block.

[gist id=1048750] Nu wordt het if block uitgevoerd als er geen Twitter-gebruiker bekend is, en het else block wordt uitgevoerd als er wel een Twitter-gebruiker bekend is. In het if block en het else block moet je alle views verbergen of juist tonen, dit kun je doen met de method setVisibility van elk View object. Als parameter moet je bij de method setVisibility een getal meegeven. Dit getal hoef je niet zelf te bedenken, maar het is in dit geval geprogrammeerd in de View class. De getallen zijn zo geprogrammeerd dat je niet een object van de class nodig hebt om het getal op te vragen, dit heten statische variabelen. In dit geval betekent het woord static (Engels voor statisch) dat de variable altijd hetzelfde blijft. Net zoals bij R.java kan je het getal opvragen door de naam van de class te gebruiken en daarachter de naam van de statische variabele te typen, gescheiden door een punt. Statische variabelen worden altijd geschreven in hoofdletters (met uitzondering van de namen in R.java), je hebt dit ook al gebruikt in DevTutorial 3 toen je een afspraak planner ging maken en van de Calendar class de statische variabele DAY_OF_MONTH gebruikte. De naam die hoort bij de statische variabele voor het tonen een View heeft de naam VISIBLE. De naam voor het verbergen van een view heet INVISIBLE. Als je dus een view wilt verbergen of juist tonen moet je de method setVisible aanroepen met respectievelijk de parameter View.VISIBLE of View.INVISIBLE .

[gist id=1048773]

[gist id=1048778]

[gist id=1048786]

Het resultaat: de methods met elkaar combineren

Nu is de method updateView klaar om gebruikt te worden: hij controleert of mTwitterUser leeg is of niet en afhankelijk daarvan worden de Views verborgen of juist getoond. Als mTwitterUser een gevuld object is, dan worden ook de TextViews gevuld met de gebruikersnaam en de website van de Twitter-gebruiker. Het enige wat nu nog moet gebeuren, is de variabele mTwitterUser aanpassen en de method updateView aanroepen. Dit moet je doen nadat je succesvol een Twitter-gebruiker hebt gedownload, dus in de method onPostExecute van je private class DownloadUserInfoTask. Zoals je misschien nog weet van de vorige DevTutoria, bestaat in de class DownloadUserInfoTask de String mResultString. Hierin zitten de gegevens van de Twitter-gebruiker in JSON formaat, als deze goed gedownload zijn. Deze String kan je gebruiken om de constructor van je TwitterUser object aan te roepen die je net gemaakt hebt. Vervolgens moet je die TwitterUser in je variabele mTwitterUser stoppen en daarna de method updateView aanroepen.

[gist id=1048812] Bij een succesvolle download worden nu de TextViews getoond met daarin de naam en de website van de Twitter-gebruiker. Het laatste probleem is nu nog, dat de Views niet meer worden verborgen als er geen Twitter-gebruiker is gevonden. Dit kan je doen door mTwitterUser op null te zetten en daarna de method updateView aan te roepen: [gist id=1048816]

Wanneer je updateView aanroept nadat je mTwitterUser op null hebt gezet, worden alle Views verborgen. Je app is bijna af, voor wat deze tutorial betreft. Start je app en probeer te kijken of hij werkt. Als je een bestaande gebruikersnaam invult, worden de TextViews en de Button getoond. Wanneer je een ongeldige gebruikersnaam invult, worden de Views verborgen.

Intents en de method startActivity

De Button met de naam mButtonTweets gaan we gebruiken om een tweede Activity op te starten als je gegevens van een Twitter-gebruiker hebt gedownload. Deze tweede Activity gaan we in de volgende DevTutorial gebruiken om tweets te downloaden van de Twitter-gebruiker. Voor nu gaan we deze Activity alleen maar gebruiken door hem op te starten, zodat we er een gebruikersnaam aan door kunnen geven vanuit onze MainActivity class. Voor het opstarten van een andere Activity, moet je de method startActivity gebruiken: die kan je hier vinden. Wanneer je deze method gebruikt, geef je aan dat je een nieuwe Activity vanuit je app wil opstarten. Voordat je een nieuwe Activity op kan starten moet je drie dingen doen:

Daarna kan je de method startActivity aanroepen. Wanneer als gevolg daarvan de andere Activity is opgestart, kan je in de ‘nieuwe’ Activity extra informatie uitlezen die je in het Intent object gestopt hebt vanuit je ‘oude’ Activity. In ons geval willen we gebruikersnaam doorgeven van de Twitter-gebruiker. Nu gaan we de drie voorbereidingen treffen voor het aanroepen van een Activity en daarna gaan we de gebruikersnaam uitlezen in de nieuwe Activity.

Zoals je weet is AndroidManifest.xml het instellingenbestand van je app. Dit bestand heb je in de vorige DevTutorial ook gebruikt om de internettoegang-permissie toe te voegen voor je app. Nu moet je ditzelfde bestand gebruiken om het Androidapparaat bij het installeren van de app te laten weten dat je een tweede Activity wil gebruiken in je app:

Je nieuwe Activity met de naam TweetsActivity is klaar om opgestart te worden (de layout fixen we zo nog). We hebben eerst een Intent object nodig om de method startActivity aan te kunnen roepen. Het Intent object dat we gaan maken kan je het beste zien als een boodschap aan het Androidsysteem dat je vanuit je huidige Activity een nieuwe Activity wil opstarten en dat je daarvoor de class TweetsActivity wilt gebruiken (dit zijn dus twee parameters: de huidige Activity en de nieuwe Activity).

  • Voeg deze code in MainActivity, in het if block van de method showTweets:

[gist id=1257740]

Nu moet je nog een extra bericht meegeven, die de Activity TweetsActivity uit kan lezen als hij wordt opgestart. Dit kan je doen op het Intent object met de method putExtra. Wanneer we die method willen gebruiken, moeten we twee berichtjes sturen: de eerste om een naam te geven aan het bericht dat je naar de andere Activity stuurt en de tweede om de inhoud van het bericht aan te geven. Als naam voor het bericht aan de andere Activity gebruiken we twitter_user_name en als inhoud van het bericht geven we de naam van de gedownloade Twitter-gebruiker mee.

  • Voeg deze code toe onder het aanmaken van het Intent object:

[gist id=1257750]

[gist id=1257754]

Nieuwe Activity invullen en de extras uitlezen

Nu is je TweetsActivity nog een lege Activity, als je hem nu zou opstarten krijg je een wit scherm. Als eerste moeten we TweetsActivity vullen met code die de juiste layout laadt en een TextView koppelt aan de TextView in de layout:

[gist id=1257770]

Nu is het tijd om het extra bericht op te vragen. Zoals je weet, had je deze Activity gestart met een Intent object, waar je via de method putExtra een extra bericht had meegeven met een bepaalde inhoud. Het Intent object dat een Activity heeft opgestart kan je opvragen met de method getIntent die in de Activity class zit (link)

[gist id=1257791] Nu je de Intent hebt die je TweetsActivity had opgestart, kan je de extra berichten uitlezen (je hebt eigenlijk maar één bericht, maar je kan er meerdere meegeven door vaker putExtra te gebruiken). De verzameling van berichten die je een Intent stopt, heten in gewoon Nederlands een bundel en zijn in Android verwerkt in de Bundle class. De verzameling berichten van het type Bundle kan je op het Intent object opvragen door middel van de method getExtras.

Je class TweetsActivity kan er nu als volgt uit zien: [gist id=1257800] Als je nu je app opstart en je vult en gebruikersnaam in en je klikt na het downloaden ervan op de Tweets knop, dan krijg de nieuwe Activity voor je met de gebruikersnaam die je zojuist had ingevuld. In de volgende DevTutorial gaan de tweets ophalen die bij de gebruiker hoort en tonen in een ListView. De DevTutorials die daarna komen gaan over het downloaden van afbeeldingen, het koppelen van Views aan en OnclickListener en het opslaan van de tweets in je lokale sqlite database. Dan heb je ongeveer wel de belangrijkste dingen van Android gezien).

Extra oefening

De extra oefening van deze DevTutorial is als volgt: Breid je class TwitterUser uit zodat ook de JSON-elementen description en favourites_count worden uitgelezen. Voor het opslaan van favourites_count moet je geen String gebruiken maar een int, daarvoor moet je voor het uitlezen de method optInt gebruiken in plaats van optString. Als je vervolgens deze int in MainActivity uitleest met getFavourites om hem in te stellen op een TextView moet je deze code gebruiken: [gist id=1265018] Doordat je het getal combineert met een lege String (de String is tussen de beide dubbele aanhalingstekens) wordt de int automatisch gecast naar een int. Pas verder de layout en je MainActivity class aan zodat de beide gegevens ook worden weergegeven op het scherm. Ook moeten de Views die je hebt toegevoegd automatisch worden verborgen als er geen Twitter-gebruiker gevonden is. Uiteindelijk kom je uit op ongeveer deze layout. Wordt het je iets te lastig dan kan je naar de sourcecode kijken op github voor inspiratie (zie volgend kopje).

Sourcecode & Forum

De sourcecode kan je bekijken op github. Hier is de voor al je vragen die horen bij deze DevTutorial.

Op de hoogte blijven?

Volg Androidworld nu ook op WhatsApp

Download de nieuwe Androidworld-app!

Reacties

13

Inloggen of registreren
om een reactie achter te laten

19 juli 2012, 21:16

Geweldige tutorial! Alleen, nu probeer ik naar nummer 7 te gaan, maar die pagina crasht.

14 maart 2012, 16:46

Waarom zou je controleren in een functie of de aanroep wel vanaf een bepaalde button komt, terwijl je die functie alleen kan aanroepen vanuit de button? Het lijkt me een beetje overbodig.

1 februari 2012, 10:33

@Tjerk Ik heb inderdaad eerst een cursus Java programmeren gedaan en heb het gevoel dat deze devtutorial daar precies op aansluit. Prima om snel inzicht te krijgen in Android. Het lijkt me echter vrij lastig als je verder geen enkele programmeerkennis hebt.

Wat hier dan weer op aan zou sluiten lijkt me inderdaad een reeks aan voorbeelden van hoe dingen anders (netter) kunnen. Zoals het Http in een Activity issue. Echter ben ik nog maar bij deel 6 en komt er nog genoeg 😉

9 oktober 2011, 16:48

Erg leuk, ik heb ook de profielfoto van twitter erop gezet!

7 oktober 2011, 16:40

Een expert is iemand die binnen een beperkt vakgebied alle mogelijke fouten heeft gemaakt.
(Niels Bohr)

Inspireer mensen en laat ze fouten maken om van te leren, zo ben je er zelf ook gekomen. Het is leuk om echte werkende apps te maken en het is altijd later mogelijk om je begrip te vergroten. Er zijn soms echt valide argumenten om niet te gaan voor een over geengineerde oplossing. Zie princiepes als worse is better en keep it simple stupid 🙂

7 oktober 2011, 12:29

@Tjerk: wat een steek in de rug man, doe het zelf beter, geef inhoudelijk aanvullingen, of zwijg. Je verwijt is zo warrig geformuleerd dat ik vermoed dat je gebrek aan vermogen om eenvoudig te schrijven je jaloezie gevoed heeft, met je giftige pen tot gevolg.
Wouter, ik ben er nog, geniet van je uitleg en heb vanaf nul voorkennis mijn eerste app geschreven dankzij je aanmoediging en kennisoverdracht. Natuurlijk lees ik ook elders, maar jij geeft het kader waarbinnen ik mijn kennis verzamel, en dat is gerust 95% van wat ik nodig had aan kennis. Hartelijk dank!

6 oktober 2011, 15:31

Het is inderdaad complex en er wordt programmeurs wat verkeerde dingen aangeleerd. Zoals ik al vaker probeer aan te geven: Leer eerst Java en Networking voordat je gaat leren Android programmeren.

De *fouten* in dit artikel
– netwerk code staat in de activity, decouple dit
– netwerk job wordt gedaan in asynctask, stop dit in een service zodat je beter de lifecycle van activity en netwerk kan scheiden
– json in een object stoppen kan, maar er zijn nog veel meer oplossingen. Zo kun je het direct naar een object unmarshallen, of je kunt xml of protobuf gebruiken. Met protobuf is het niet nodig handmatig te unmarshallen.
– Gebruik geen HttpClient maar gebruik HttpConnection voor nieuwere android versies, zie artikel op developer.android.com
– De excepties worden niet goed afgehandeld (alleen de stacktrace printen is niet genoeg)

Al met al zit dit artikel vol met content en begrippen, niet echt geschikt voor starters. Nogmaals, je kunt pas met Android starten als je Java onder de knie hebt. En ook networking (http stack, ip stack etc)

6 oktober 2011, 13:26

Ik heb tot nu toe nog niks uitgeprobeerd van jullie tutorial’s maar ik volg ze wel. Altijd super handig zulke tutorial’s en men kan altijd stukken ervan gebruiken!! ga zo door!!

6 oktober 2011, 10:40

Ik volg hem nog. Duidelijke en leerzame tutorials! Komend weekend deze maar eens doen. Ga zo door Wouter!

6 oktober 2011, 9:05

off-topic: steve jobs is gisteren overleden http://www.apple.com/nl/ kijk daar maar en op internet rust in vrede

6 oktober 2011, 1:34

Ik ben er ook nog steeds :-)))

6 oktober 2011, 0:20

Ja, ik kan het zeker nog volgen, en ik vind deze reeks geWELdig! Bedankt!

5 oktober 2011, 23:14

Het is allemaal best moeilijk geworden. Zijn er nog veel die het kunnen volgen? Toch fijn dat zoiets er nu is. tnx