Komentáře k článku
Vyvíjíme pro Android: Suroviny, Intenty a jednotky

V dnešním článku, který je součástí seriálu Vyvíjíme pro Android, si povíme něco o délkových jednotkách v Androidu, naučíme se pracovat s resources, naučíme se spouštět activity a pracovat s view.
Resources jako suroviny?
Obvyklý překlad „resources“ je spíše „zdroje“. A nebál bych se podobností se slovy „source / sources / source code“ a jejich překladů „zdroják / zdrojáky / zdrojový kód“.
Mně osobně přijdou podobné obrozenecké snahy o český překlad běžných vývojářských termínů poněkud úsměvné. Ovšem nelze jim (v některých případech, včetně tohoto) upřít i slušnou dávku vynalézavosti.
Sice preferuji odborné texty v angličtině, ale chápu, že v rámci popularizace témat pro širokou veřejnost se česká verze hodí. I když dříve nebo později se člověk obecně rozšířenému jazyku autorů SDK a dokumentace naučit musí.
Re: Resources jako suroviny?
Sákriš, nějak jsem opomněl…
Jinak hodnotím článek pozitivně, jako celkem slušný náhled to Androidiího programování ;-)
Re: Resources jako suroviny?
Děkuji za pochvalu.
Nad slovem zdroje jsem uvažoval dlouho, ale pak mně přišlo takové…příliš obecné. Jednak by mohlo evokovat zdrojové kódy, jednak nějaké zdroje informací, ze kterých jsem čerpal, jednak, ale to je už hodně moc subjektivní, mi slovo zdroj přijde jako zdroj dat, tedy zdrojem bych rozuměl spíš nějakou webovou službu, z níž data získám. Nebo databázi.
Suroviny jsou naopak ta samotná data. A pro resources mně osobně přišla popisnější tato varianta.
Také nemusím přehnané puristy, kteří překládají všechno. Vůbec se nebráním používání anglických termínů, má to i tu výhodu, že člověk lépe porozumí anglickému textu o tomtéž. Ale se slovem resources jsem bojoval dost dlouho, jednak to není zas až tak jasný termín, ale hlavně je nesklonný. A to už se mi nelíbí a hlavně se mi to strašně špatně píše. A newspeak se mi vyloženě hnusí a nechci se k němu přibližovat.
Re: Resources jako suroviny?
připojuji se k pochvale a přidám do debaty svůj pohled na slovo resources
pro sebe bych mohl chápat resources jako prostředky k přístupu ke zdrojům, takže v jednom případě jsou resources prostředky a ve druhém zdroje… slovo suroviny mi osobně sedí k RAW datům…
Re: Resources jako suroviny?
+1 pro resources -> zdroje, co vím, tenhle překlad jsem slyšel už před snad patnácti lety v souvislosti s linkováním dat do binárek, ať už to byly string konstanty, binární data či třeba ikony – dodnes se např. ve Windows PE formátu (.exe, .dll, …) termíny resources a embedded resources používají a překlad v české literatuře byl právě jako „zdroje“.
Pokud by byl překlad matoucí, je jepší nepřekládat vůbec
plurals
Díky za článek. Jenom jedna připomínka k plurals. Konkrétně:
„Nás bude speciálně zajímat jednička a potom malá čísla (2, 3, 4). Zbytek je stejný (včetně nuly).“ a „Polština používá few pro každé číslo končící na 2, 3 nebo 4, ale ne na 12, 13 a 14.“
Abych to uvedl na pravou míru, podobně, jak je to tu uvedené u polštiny, to má i čeština. Všechna čísla končící 1 a 2 – 4 (kromě čísel končících 11 a 12 – 14) se zapisují podle stejného pravidla. Tedy např. 1 rok, 2 roky, 4 roky, 5 let, 11 let, ale dál je to 21 rok, 22 roky, 24 roky, 25 let, 103 roky. Spousta lidí to píše špatně (21 let, 103 let), protože je to pro ně jednodušší na přemýšlení (resp. na absenci přemýšlení), ale správně to má být podle zmíněného pravidla.
Nevím tedy, jak to píše Android, ještě jsem program nezkoušel. Na to budu mít čas až později.
Re: plurals
Nemáte, pravdu, dle Ústavu pro jazyk český je možná i lenivá varianta, která je v současné době mnohem používanější, dokonce mě osobně třicet jeden muž už trochu tahá za uši a připadá mi to hyperkorektní (což je samozřejmě jen osobní pocit). Já každopádně tuto variantu používám pouze s ironickým podtextem.
Za chvíli vyzkouším, jak to dělá Android, jsem však přesvědčen (a mám pocit, že jsem si to i kdysi vyzkoušel), že používá lenivou variantu.
Re: plurals
Za „Nemáte“ mám samozřejmě přebytečnou čárku – překlep.
Jinak jsem vyzkoušel, jak plurály na Androidu fungují, a opravdu je to tak, jak jsem předpokládál, tedy že „few“ je pouze pro {2, 3, 4}, nikoli i pro čísla, která na tyto číslice končí, kromě {12, 13, 14} a čísel na {12, 13, 14} končících.
Testovací aplikace vypadala nějak takto:
/res/values/plurals.xml:<plurals name="test"> <item quantity="one">%1$d one</item> <item quantity="few">%1$d few</item> <item quantity="other">%1$d other</item> </plurals>Activity:
EditText et = (EditText)findViewById(R.id.test); Resources res = getResources(); String val = res.getQuantityString(R.plurals.test, 1, 1) + "n" + res.getQuantityString(R.plurals.test, 2, 2) + "n" + res.getQuantityString(R.plurals.test, 4, 4) + "n" + res.getQuantityString(R.plurals.test, 12, 12) + "n" + res.getQuantityString(R.plurals.test, 21, 21) + "n" + res.getQuantityString(R.plurals.test, 24, 24) + "n" + res.getQuantityString(R.plurals.test, 152, 152) + "n" + res.getQuantityString(R.plurals.test, 9876373, 9876373); et.setText(val);Výsledek: http://public.shulik.cz/zdrojak_plurals.png
Re: plurals
No já osobně taky používám „lenivou“ variantu, ale byl jsem přesvědčený o tom, že to není správně. Dá se někde na stránkách ÚJČ zjistit, jak stará je ta aktualizace, od kdy je možné onu „lenivou“ variantu používat?
Fajn, tak u textu napíšu velikost v dp. Ale co obrázky?
Nebyla by u textu vhodnější jednotka „sp“?
Re: Fajn, tak u textu napíšu velikost v dp. Ale co obrázky?
Byla, máš pravdu, tohle byl ode mě hodně nešťastně zvolený nadpis.
Nechtěl jsem do jednotek zabředávat nějak více, takže jsem zmínil jen
dp, neboťspjsou jen pro text, a když se místo nich použijedp, aplikace bude dál fungovat, i když ne tak perfektně. Což nic nemění na tom, že jsem nemusel psát, že zrovna u textu napíšudp.Děkuju moc za upřesnění. Poprosím Martina, jestli by místo textu dal do nadpisu třeba rozměry.
Když už překlad, tak ne polovičatý
Když už někdo chce zbytečně počešt´ovat, tak proč nepřeložit i Intenty jako Úmysly?
Re: Když už překlad, tak ne polovičatý
podobne s layouty
Perfektní článek
Ahoj,
díky za perfektní článek a určitě přeji hodně energie do psaní dalších :-)
Chtěl jsem se zeptat, zda-li by šlo ke každé kapitole / ukázce appky napsat i jednotkový či integrační test – podobně jak to má v tutoriálu AngularJs.
Mohlo by se to u článků stát standardem, ať si na to programátoři zvykají, že psaní testů k aplikačkám je standard. Osobně bych to uvítal, už jen ohedně základů v JUnit? a testování android aplikací.
Mohl by s tím i Matějovi někdo pomoci?
A v poslední řadě bych jen upozornil na překlep:
řetězce, jeden s id ###displayed_age_1### a textem Je Ti (a nezapomeňte na mezeru na konci!) a druhý s id ###displayed_age_1### a textem let.
Ještě jednou díky za článek.
PS: br mi v komentáři nefungují :-o
Re: Perfektní článek
Autory psaním testů zatěžovat nebudeme, stačí kolik práce s nimi mají teď. Rozhodně se ale nebráníme, pokud někdo chce testy napsat 8-)
Re: Perfektní článek
Děkuju za upozornění na překlep (a děkuju Martinovi za opravu).
Co se testování týče, sám jsem „obětí” toho, že články, návody a dokumentace jsou beztesté. Zpočátku jsem testy opravdu plánoval, ale narazil jsem hned na dvě překážky – jednak na určitou netestovatelnost části toho, co jsme zatím napsali (a hlavně toho, co bude v příštím článku) a jednak na svou neschopnost psát stručně. Už bez testů jsou články mnohem delší, než je doporučená délka (4–8 tisíc znaků doporučených vs. velmi zhruba asi 30 tisíc znaků tohoto článku bez všech výpisů kódu (<pre>).
Mám nicméně nápad na takový trochu neotřelý dvojčlánek, který by ukazoval, jak ve skutečnosti vývoj pro tak rychle se rozvíjející platformu funguje, tedy že člověk zná základy, ale plno věcí se nutně musí učit za běhu, kde by se uplatnilo i testování. Buďto to bude závěr tohoto seriálu, anebo to publikuju někde u sebe (anebo to vyšumí :D).
Každopádně se nějakým způsobem v rámci našeho seriálu o testování zmíníme, ale rozhodně to nebude soustavné testování tak, jak by asi mělo být, ale spíše představení testování pro Android se zaměřením hlavně na nejavovské testování, tedy testování UI, zjišťování, zda se spustila správná activity, zda je v edittextu správná hodnota atp.
Instalace aplikace
Už se nemůžu dočkat dalšího dílu seriálu a než se dočkám, chtěl bych se zeptat na jednu věc. Když aplikaci ladím na fyzickém HW, aplikace se v podobě apk balíčku zkopíruje do zařízení (případně se napřed odinstaluje předchozí verze), nainstaluje a spustí. Všechno jede v pořádku. Když ale zdrojové kódy dané aplikace zkopíruju na jiný PC (sdílím si je mezi víc PC přes SVN), tam spustím Eclipse a chci tu stejnou aplikaci ladit na tom stejném HW zařízení, jen z jiného PC, nadává mi to, že aplikaci nejdřív musím ručně odinstalovat (Re-installation failed due to different application signatures. You must perform a full uninstall of the application.). Dá se mu nějak vysvětlit, že je mi jedno, z kterého PC stejnou aplikaci instaluju? V chybě se píše něco o „different application signatures“, je tedy možné aplikaci nějakým způsobem podepsat, aby ji bylo možné ladit z jakéhokoliv PC bez nutnosti ruční odinstalace?
Re: Instalace aplikace
Děkuji za pochvalu :).
Předem se omlouvám, že mé vysvětlení je spíše hypotéza – nikdy jsem podepisování nestudoval ani z informatického, ani z matematického hlediska. Ale na základě Signing Your Applications (speciálně Signing in Debug Mode) a hodně zběžného prolétnutí dokumentace Keytoolu si dovolím tvrdit následující odstavce (a mimochodem děkuji za námět na studium, až si budeme ke konci povídat a podepisování a zveřejňování aplikace, pokusím se zahrnout i hodně stručný popis, jak to funguje).
Každý .apk soubor musí být podepsaný. Podepsání nejspíše znamená několik bajtů, které si může každý rozkódovat podle veřejného klíče, čímž zjistí jejich obsah, ale jen já znám celý, privátní klíč, bez něhož nelze data zašifrovat.
Podepsané jsou i .apk soubory, které se nahrávají do AVD respektive na telefon při debugování. Jsou ale díky Eclipse podepsané automaticky, že o tom vůbec nevíme, a jsou podepsané klíčem vytvořeným s přesně specifikovanými daty, která jsou vypsána ve výše odkázaném článku na Android Developers.
Klíče se vytvoří tak, že
keytoolpředám nějaká data (alias, heslo, atd.) a on vygeneruje náhodný klíč (nějaké číslo). Ten klíč stačí k rozšifrování informace, ale abych ji mohl zašifrovat, potřebuji znát privátní klíč, který se skládá z toho náhodného, veřejného, a ještě k tomu z předaných dat.Díky tomu může Android zjistit, zda je aplikace podepsána debugovacím či nedebugovacím klíčem, a podle toho mi například zakázat takové .apk nahrát na Play Store.
Myslím si, že proces podepisování .apk se neliší od jakéhokoli jiného elektronického podepisování dokumentů (až na to, že nemusím platit certifikační autoritě za klíč, ale vyrobím si ho sám).
Protože do generování klíče vstupuje i náhoda, na každém z Tvých počítačů je klíč jiný, přestože soukromou část mají vlastně stejnou. Proto musíš .apk vždycky odinstalovat.
Ale ještě jednou radši zmíním, že celé to, co jsem napsal, je jenom hypotéza založená na asi třech minutách proběhnutí dokumentace, jakés takés znalosti RSA šifry a předpokladu, že podepsání je vlastně opačná verze RSA (dešifrovat může každý, šifrovat jen já).
Pokud je můj předpoklad správný (o čemž pochybuju, neboť jsem ho vyrobil prakticky z ničeho), mohlo by stačit najít, kde je uložený klíč na jednom počítači a překopírovat ho na druhý (to je ale opět jen hypotéza).
Další možnost (opět jen hypotéza, nikdy jsem s tím nedělal) by mohla možná být taková, že by sis vytvořil vlastní debugovací klíč a ANTový program, který by se spustil při kliknutí na eclipsovou zelenou šipku místo toho původního a dělal by vlastně to samé, co Eclipse, akorát se stejným klíčem.
Jestli existuje i jednodušší varianta, nevím, ale myslím, že je-li má hypotéza správná, tak ne.
Budu moc rád, pokud to někdo vysvětlí pořádně a správně anebo mě odkáže na srozumitelný článek pro dummies.
Re: Instalace aplikace
Díky za vysvětlení a za odkazy. Zkusím s tím podepisováním něco pokoumat a pokud na něco přijdu, určitě se o to podělím.
Chybička ve článku?
Jen se chci zeptat, zda je myšleno správně u příkladu použití modifikátorů „res/values/en-GB“? Nemá tam být „res/values-en-GB“?
Spouštění aplikace v AVD
S programováním pro android začínám (jinak 25 let v různých jazycích a prostředích). Mám Eclipse Indigo, podle návodů jsem si nainstaloval všechno pro Android. Postupuji podle toho seriálu (jinak dík za něj), aplikaci „přeložím“ a je bez chyb, ale když ji spouštím přes AVD, tak se rozjede jen AVD a nic. žádné Hellou světe nebo edity a tlačítko.
Nevíte někdo mi poradit. Předem díky
Igor Vodička
Re: Spouštění aplikace v AVD
Vážně? To se mi nikdy nestalo…
Děláte to tak, že si vytvoříte AVD, vytvoříte projekt a potom stisknete velkou bílou šipečku uvnitř zeleného kroužku nahoře (
Ctrl + F11)? Počkáte chvíli, než se AVD pořádně spustí a aplikace se do něj stihne nahrát?Zkuste se podívat, jestli se aplikace vůbec nahrála, tzn. zjistěte, jestli je na ni v menu AVD odkaz.
Co vypisuje konzole (
Shift + Alt + Q → Pustit a pak zmáčknout C)? Co vypisuje ADB (taková ta malinká zelená ikonka ležícího Androida)?Re: Spouštění aplikace v AVD
Moje chyba! Byl jsem netrpělivý, dal jsem tomu čas a AVD se po několika minutách spustilo i s aplikací.
Přesto dík za reakci.
Nesrovnalosti v kódu
V první řadě díky za super článek, už dlouho jsem se chystal začít s androidem, ale odradil mě nedostatek podrobných článků.
Myslíte, že byste mohl upravit tu část článku, ve které je uvedený kód metody getAge? Na několik minut mě zarazila, protože se mi nedařilo konečný kód hned rozběhnout. Soubory ke stažení jsem nezkoušel, je možné, že tam tahle chyba není.
místo :
String text = res.getString(R.string.displayed_age, age);
by tam mělo být, pokud jsem něco nepřehlédl:
String text = res.getQuantityString(R.plurals.displayed_age, age, age);
první varianta nepůjde ani zkompilovat. Bez 3. parametru, se vypíše pouze formátovací řetězec.
Jen pro budoucí generace, které se podle tohoto článku budou chtít v androidu učit programovat, já si s tím nakonec poradil.
A ještě jednou díky za článek, doufám, že se tento seriál uchytí a budou přibývat další díly.
Re: Nesrovnalosti v kódu
Nefunguje Vám to, protože jste z /res/strings.xml odstranil původní string s id displayed_age. Metoda
Resources.getString(int id, Object... formattingArgs)existuje.Ta vsuvka o plurals je jinak podbarvená, což by mělo znamenat, že je to vsuvka.
Každopádně děkuju za reakci, popřemýšlím, jestli to nějak změnit.
eclipse - poriadok v projektoch
Keď robím v eclipse na tomto ukážkovom projekte, vidím v časti Problems (dole v záložke) warningy aj z iných projektov. Ja chcem vidieť len warningy z projektu, ktorý mám práve otvorený, aby som mal prehľad. Ako to dosiahnem? Medzi toľkými warningami je ťažko si všimnúť, že mi nejaký pribudol.
Re: eclipse - poriadok v projektoch
Staci ostatni projekty zavrit, pravy mysitko nad projektem a Close Project.
Re: eclipse - poriadok v projektoch
Tak to si ma pobavil. Nič v zlom. Ja tie projekty nechcem potom otvárať znova. Otvorené sú preto, lebo s nimi niečo robím. Len chcem prefiltrovať tie varovania tak, aby som videl len varovania z projektu, na ktorom mám nastavený kurzor. Skúšal som aj vytvorenie workspace, čo som myslel, že je práve na niečo také, ale nepomohlo.
Chybicka?
Neviem ci to iba mne, ale podla navodu sa mi nepodarilo vypisat zadany vek.
Namiesto konkretneho cisla mi vypisovalo %1$d.
Vyriesl som to tym, ze som riadok:
String text = res.getQuantityString(R.plurals.displayed_age, age);
// pouzivam plurals a nie 1 identifikator
zamenil za riadok:
String text = String.format(res.getQuantityString(R.plurals.displayed_age, age), age);
Aj v tom odkaze na manual prace so String pouzivali String.format na vratenie(aj ked oni tam pracovali s metodou getString()).
Re: Chybicka?
Zbytečně složité. Použij:
String text = res.getQuantityString(R.plurals.displayed_age, age, age);
Předávání argumentů
Já jenom nechápu, jak jedna activity předá hodnotu proměnný age tý druhý co to zobrazí…
Re: Předávání argumentů
Pomocí Intent extra, je to přesně tento řádek:
unfortunately .. stop :(
prikliknuti mi to pada, a netusim kde sem udelal chybu :(
domnívam se z tohoto logu http://leteckaposta.cz/633269194
ze je to tím, ze mi tam chybí nejaka reference na string? ze ji nenasel, nebo ze je spatne pojmenovana?
Re: unfortunately .. stop :(
Jaký element má name=“displayed_age“? je to <string>, anebo <plurals>?. O <plurals> jsem mluvil jen pro zajímavost, ty do aplikace nepatří. Patří tam
Re: unfortunately .. stop :(
vzkutku, nějak jsem to přehlídl :)
Kódy
Všechny články se mi líbí, ale je to trochu nepřehledné – začínám se ztrácet, člo bi udělat nějakou jednoduchou verzi – popsáno co jak dělá – řečeno co kam dát a podobně.
PS: jaká je klávesová zkratka na špičatou závorku??? :)