• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    LWEEKAndroid development
    DATEL
    DATEL --- ---
    DRIZDIK: tak jsem zkusil přesunout to voání super v onPause na začátek, ale nepomohlo to. Wipnul jsem emulátor, takže aplikace byla čistá. Přidal jsem dva záznamy, v pohodě. Když jsem chtěl přidat třetí, tak se otevřel druhý fragment s formulářem, tam jsem dal vybrat datum, načež se otevřel fragment dialog pro výběr datumu a v té chvíli to vyplivlo zase exception. Ale všiml jsem si, že nejspíš v jiném vlákně než je GUI. Výpis z LogCatu přikládám v příloze.



    DATEL
    DATEL --- ---
    DRIZDIK: ono to neumře, že by to ukončilo aplikaci, ty výjimky to háže pouze do CatLogu, aplikace funguje normálně dál. Zkus vytvoři novou položku, pak třeba rolovat seznamem. Nebo víckrát zadat za sebou novou položku. Většinou to tu chybu do logu hodí.
    Co se týče těch superimplementací, tak ty jsem předtím měl na začátku, ale bylo to nastejno, alespoň co si vybavuju, ještě to zkusím.
    DRIZDIK
    DRIZDIK --- ---
    DATEL: mně se nedaří nasimulovat to umření, ale minimálně bych vždycky v těch metodách volal super implementace před vlastním kódem.
    DATEL
    DATEL --- ---
    Tak ještě k tomu mému problému s uzavíráním kurzoru a databáze, už fakt neví, co s tím. Pokud budete někdo ochotný se kouknout na zdroják, tak je přiložen, budu vděčný na každou pomoc. Je to moje první aplikace, na které se učím, tak se moc neděste (není třeba vůbec doimplementována varianta pro "dualpanel" pro tablety) :)

    Abych to ještě jednou popsal, mám TachoListFragment coby potomka ListFragmentu a to je taky hlavní fragment. V onStart() otevírám DB (model) a dělám update listu, ve kterém si modelem vezmu cursor na seznam, který předám TachoListAdapteru a ten pak nastavím třídě pomocí setListAdapter().

    Pokud pak v aplikaci nechám otevřít dialog pro přidání nové položky (onAddRecordClicked v MainActivity), tak v onPause() TachoListFragmentu zavírám cursor i db. Jenže podle debug záznamů v LogCatu mi to po onStop() vyhodí výjimku

    java.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT _id, date, daily_counter, main_counter, description FROM records ORDER BY date DESC, _id DESC)

    a netuším proč ani kde, protože v otevíraném AddRecordFragment se s tím cursorem nijak nepracuje.

    Když zakomentuju to uzavření cursoru i db, tak to jede, ale pak to zas háže do LogCatu ty výjimky (ale neshodí aplikaci), že aplikace finalizuje cursor, který nebyl nikdy uzavřen atd. Ne vždycky, ale dost často :(

    Díky za každou pomoc.

    DATEL
    DATEL --- ---
    DRIZDIK: myslel jsi asi onSaveInstanceState(), že? Tu používám v jiném fragmentu. Co se týče toho retaintInstance, tak to nikde nepoužívám, takže nevím, jak je nastaven. Mě spíš zarazilo, že se to v reále chová jinak než jak píšou v ofiko dokumentaci, na tom onStop() by to mělo zkončit a ne jít až do onDestroyView a posléze onCreateView.
    LUKASL
    LUKASL --- ---
    Zdravím, hledám pro svůj rozsáhlý projekt programátora Android.

    1) Jedná se o naprogramování aplikace podobné http://aplikace.o2active.cz/detail.php?id=781#.Ubht5ED0Ekc s mnohem více funkcemi. Pro první verzi by ale stačili základní verze s postupnm rozšířením

    2) Jedná se o aplikaci s prací telefonním seznamem a komunikací API přes URL odkazy
    DRIZDIK
    DRIZDIK --- ---
    MRTVY_KENNY: pokud to neni teba nijak online aktualizovat coz nevidim duvod s tim co pises a pozadavky. Tak si to napis jako kvalitni staticky !responsive! HTML5 a mas hotovou mobilni appku kterou jen protáhneš přes phonegap build službu

    Registrace na AppStore je potřeba počítat s nutností faxování a pokud budeš dělat firemní účet, tak ověřenýho překladu výpisu z živ. rejstříku.
    MRTVY_KENNY
    MRTVY_KENNY --- ---
    VIRTUALVOID: s tim pocitam
    VIRTUALVOID
    VIRTUALVOID --- ---
    MRTVY_KENNY: iphone neporiesis bez nakladov, budes potrebovat 99$/year + zopar stoviek za podpisovy certifikat.
    MRTVY_KENNY
    MRTVY_KENNY --- ---
    VIRTUALVOID: no tim phonegapem resim ten iphone. nemam maca.
    VIRTUALVOID
    VIRTUALVOID --- ---
    MRTVY_KENNY: moja registracka trvala tak tyzden, takze sa zaregistruj cim skor, tym
    lepsie. schvalenie aplikacie + zobrazenie v gp na samotnych devices trva +/- 4 hodiny.

    na phonegap sa vykasli... nativne to urobis rychlejsie (+ ti tu bude vediet vela ludi poradit)
    MRTVY_KENNY
    MRTVY_KENNY --- ---
    zdravim..
    byl by nekdo ochoten mi pomoct radama pri vyvoji prvni mobilni appky (rekneme takovy osobni mentoring, nechcu vsechny zatezovat zacatecnickyma dotazama)?
    jsem se zarek, ze do toho musim vstoupit a nerad bych se vydaval nejakyma slepyma ulickama..
    sehnal jsem si zakazku, ktera je ciste ucici, takze prakticky zadarmo, k tomu ucelu, aby me to dokopalo v danem terminu neco udelat..

    jde o klasickou mobilni appku k malemu festivalu, tzn nejake profily ucinkujicich, mapku se stagema a lineup (tohle je minimum, ktere budu rad, kdyz zvladnu, nejake dalsi ficury bych pridaval az bude tohle hotovo a funkcni a zbyde cas)..

    appka by mela byt nejmin pro android a iphone.

    muze me nejak nakopnout, co k tomu ucelu nejlepe pouzit?
    jsem ve stadiu, kdy bych chtel asi pouzit phonegap (kvuli cross-device) a uz jsem vystoural i nejaky hotovy klikaci lineup, ktery se jenom preskinuje, pripadne doladi, co nebude vyhovoat..

    ale dal nevim vubec co. moje znalosti konci u jedne aplikaci pro jquerymobile, kterou jsem delal, ale ta bezela normalne pres url v browseru, coz ted nechcu.

    nasel jsem si i nejaky predpripraveny phonegap skeleton (hello world), ale ten mi naposled nejak v mobilu padal, pak uz jsem nemel nervy :)

    za kazdou radu budu vdecen, asi potrebuju trosku povodit za rucicku. navic na to neni uplne moc casu..

    ze startu me teda zajima nejmin:
    1/ ten phonegap je ok reseni (neni cas na to to psat zvlast pro iphone a pro android a i rozpocet se blizi nule. a taky bych se chtel naucit "standard" ktery pravdepodobne zuzitkuju i v budoucnu)?
    2/ s jakou prodlevou bych mel pocitat ohledne tech appstoru vcetne develop registraci? aby se nestalo, ze festak probehne a oni to budou nejak validovat a nebude to k dispozici..?
    3/ co dal? mam si udelat staticky "web", ktery strukturou odpovida te appce?

    za jakekoliv rady diky. jak jsem psal na zacatku, tak pokud nekdo bude tak ochotny, ze bych veci mohl resit pravidelne i v prubehu vyvoje, budu radsi, kdyz mi napise do posty, nez vsechny otravovat tady..
    DRIZDIK
    DRIZDIK --- ---
    VIRTUALVOID: DATEL: In memory pracovat často nejde, ale zkus si ještě metodu onSaveState. To jestli se ti fragment zničí nebo ne taky ovlivnuje jestli ho máš nastavenej jako retaintInstance. Tam ti pak zůstane stejná instance včetně instančních proměnnejch při přetáčení a podobných akcích, kdy ti jinak pouze zkusí zachovat state pomocí onSaveState ale instanci vytvoří novou.
    VIRTUALVOID
    VIRTUALVOID --- ---
    DATEL: co sa tyka tej druhej otazky tak s tym ti neporadim. mozno len tak, ze by som si nacital vsetky data in-memory a zmeny robil iba on-demand.
    VIRTUALVOID
    VIRTUALVOID --- ---
    DATEL: ja to robim tak, ze pridam vsetky fragmenty (cez kod, fragmentManager) do kontajneru cez metodu add (plus nejaky ten tag coby stringovy identifikator) a ten ktory chcem aby bol zobrazeny ako prvy dam show. tie ostatne hide.
    vtedy sa to nerecreatuje. chce to teda, ale trochu viac kodu na handlovanie.
    DATEL
    DATEL --- ---
    Díky všem za info. Měl bych další dotaz, respektive nejasnost. V originální dokumentaci o použití fragmentů (http://developer.android.com/training/basics/fragments/fragment-ui.html) je poznámka:

    Note: When you remove or replace a fragment and add the transaction to the back stack, the fragment that is removed is stopped (not destroyed). If the user navigates back to restore the fragment, it restarts. If you do not add the transaction to the back stack, then the fragment is destroyed when removed or replaced.

    Já při výměně fragment dávám do back stacku, ale i přesto když pak vyměňuju fragment, tak se mi na tom původním volá onDestroyView a po "uzavření" nového fragmentu (což je formulář pro novou položku) zavolám getSupportFragmentManager().popBackStack(); a pak se tedy pro původní fragment volá onCreateView atd.

    Další věc, co při konverzi na jednu aktivitu začala zlobit, je uzavírání kurzoru a databáze ve fragmentu pro seznam. Dokud jsem otevíral ten formulář pomocí aktivity, tak to jakžtakž fungovalo (viz. předchozí příspěvky), ale když jsem to předělal, tak mi při vyvolání nového fragmentu (s formulářem) aplikace spadla s výjimkou "attemp to re-open an already-closed object" a týkalo se to právě toho kurzoru. Jenže vůbec netuším, proč. Dal jsem si breakpointu do všech metod a padá to po onStop ve fragmentu se seznamem. To uzavření kurzoru a DB je v onPause. Přitom ten onStop proběhl v pořádku. Do onDestroyView mi debugger už nedošel a snažil se otevírat vnitřní zdrojáky Androidu, které tam nemám. Máte nějaký tip, na co se podívat?
    DRIZDIK
    DRIZDIK --- ---
    Každý přístup je dobrý pro jiné použití. Teď například dělám aplikaci, kde hlavní aktivita spravuje loading v intervalech pomocí loaderu a na ní pouze vyměňuju spoustu fragmentů. Ty pokud mají nějakou akci, tak jí přidají do fronty a aktivita jí odešle na server a o výsledku (změně dat) notifikuje všechny observery, takže si každý fragment může obnovit data. Stejně tak po každý loadu na aktivitě jde notofikace pro observery.

    Ale implementovat všechny metody na aktivitě mi nakonec přišlo většinou jako zbytečný datlování a o nějakým decouplinfu se tam moc nedalo mluvit.
    VIRTUALVOID
    VIRTUALVOID --- ---
    DATEL: skus obe, uvidis co ti bude vyhovovat viac :)
    DATEL
    DATEL --- ---
    DRIZDIK: hm, zajímavé, takže každý fragment máš v podstatě samostatný "blackbox", který funguje kompletně sám o sobě včetně načítání a ukládání dat? Zatím jsem právě všude viděl (knihy, tutoriály i android dokumentace) to, že se má ve fragmentu vytvořit interface, který aktivita musí implementovat a tyhle ukládací věci se pak dělají v aktivitě. Na druhou stranu tvé řešení má výhodu, že fragment je opravdu samostatná jednotka, kterou když přesunu do jiné aktivity, tak by měla víceméně fungovat, aniž bych musel přenášet i metody z jedné aktivity do druhé.

    No, tak teď fakt nevím, kterou cestou se dát :)
    DRIZDIK
    DRIZDIK --- ---
    DATEL:
    já tohle řeším tak, že tyhle data (nejlépe pouze id) předám fragmentu v Argumets bundlu. Fragment se poté sám postará o zobrazení progress, načtení na pozadí vlastním loaderem a zbrazení případně uložení. Snažím se ho jako funkční celek oddělit od aktivity, aby byl použitelnej i na jíném místě.
    Mezi fragmenty komunikuju pomocí Observer patternu a funguje to relativně dobře.

    Rozdělení na je celkem na tobě. Někdo se snaží vše řešit v jednom, někdo odděluje, aby se zachovávali intenty, které ti pak pomůžou pži zabití aktivity obnovit předchozí stav - to je velice důležitý.
    Kliknutím sem můžete změnit nastavení reklam