• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    LWEEKAndroid development
    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ý.
    DATEL
    DATEL --- ---
    VIRTUALVOID: super, tohle je mi už jasný, díky :)
    VIRTUALVOID
    VIRTUALVOID --- ---
    DATEL: co zoznam, to aktivita. urob niekde menu/zoznam, ake veci vlastne chces urobit. potom si sprav mockupy...

    alebo inak to skusim napisat: co typ entity to samostatna aktivita+fragmenty
    DATEL
    DATEL --- ---
    VIRTUALVOID: VIRTUALVOID: Ok, tomu rozumím, ale pokud ta aplikace bude mít více různých seznamů, formulářu apod., tak v té hlavní aktivitě by ty akce mohly narůst velice rychle a ten počet 40 překročit. Ono už vlastně i to, že aktivita implementuje události fragmentů např. pro uložení dat po odeslání formuláře, naplňování formulářů z daty atd., způsobí její nabobtnání. Nebo co by vlastně samotný fragment měl všechno řešit? Pouze obsluhu svých View (eventuelně otevírání dalších aktivit/dialogů, např. pro výber datumu)? Veškeré ukládání dat pak předává právě aktivitě.
    VIRTUALVOID
    VIRTUALVOID --- ---
    hlavna aktivita by potom mala riesit cez callbacky operacie daneho fragmentu
    VIRTUALVOID
    VIRTUALVOID --- ---
    DATEL:
    Na jednu stranu pokud je mám všechny v jedné aktivitě, tak bude jednodušší komunikace mezi fragmenty, na druhou stranu, kdyby byla aplikace rozsáhlejší, tak mít všechno v jedné aktivitě je podle mě taky nesmysl.

    nieje to nezmysel. pretoze by si nikdy nemal mat 40 akcii v jednej aktivite, ale nejak logicky to rozdelovat.

    ja som doteraz vzdy siel cestou hlavna aktivita + jej logicky patriace fragmenty.
    v tomto pripade :
    hlavna aktivita :
    - fragment pre zobrazenie v liste
    - fragment pre editaciu/zobrazenie detailu

    na editaciu / detail nepotrebujes dva rozne fragmenty... len ked dany zaznam budes otvarat ako detail tak nastavis textboxy,etc. ako readonly. napr.
    DATEL
    DATEL --- ---
    VIRTUALVOID: díky za tip, jsem začátečník, takže parcelable neznám (respektive zahlédl jsem ho v dokumentaci), tak se na to podívám - předpokládám, že to umožňuje dávat do intentu jakýkoliv objekt, takže půjde nejspíš o implementaci nějakého rozhraní, pomocí kterého se v té třídě Record určí, co se ukládá atd.?

    A jak s těmi fragmenty? Blbý je, že ať kouknu kam chci, tak všechny tutoriály i EN knihy fragmenty nakousnou jen v základu a jako příklad tam dají seznam a vložení nové položky, ale třeba právě editaci již existující a právě přenos dat do fragmentu (eventuelně skrz další aktivitu) se nikde neřeší :(
    VIRTUALVOID
    VIRTUALVOID --- ---
    DATEL: sprav to ako parcelable, nech nemusis puttovat do bundlu objekty na per property basis
    DATEL
    DATEL --- ---
    A teď bych měl dotaz z jiného soudku. Základy jsem studoval ze seriálu na Zdrojáku. Rád bych se zeptal, jakým způsobem řešíte fragmenty ve spojitosti s activity.

    V tom tutoriálu (http://www.zdrojak.cz/clanky/vyvijime-pro-android-fragmenty-a-sqlite-databaze/) je totiž pro variantu "malé" obrazovky použita sólo aktivita pro fragment s formulářem a sólo aktivita pro zobrazení detailu (a samozřejmně hlavní aktivita). Oproti tomu v dokumentaci (http://developer.android.com/training/basics/fragments/communicating.html) používají pouze jednu hlavní aktivitu pro všechny fragmenty.

    Kdybych nepoužil fragmenty, tak je jasné, že pro každou zmíněnou akci budou sólo aktivity. Jakým způsobem je tedy lepší fragmenty začleňovat do aktivity? Na jednu stranu pokud je mám všechny v jedné aktivitě, tak bude jednodušší komunikace mezi fragmenty, na druhou stranu, kdyby byla aplikace rozsáhlejší, tak mít všechno v jedné aktivitě je podle mě taky nesmysl.

    Dá se tedy říci, že pro malé aplikace se dá použití varianta jedné aktivity pro všechny fragmenty a pro větší aplikace (co je větší aplikace?) pak rozdělení na více aktivit?

    Právě řeším v té jednoduché aplikaci to, že fragmenty mám ve více aktivitách a potřebuju při výběru položky ze seznamu (hlavní aktivita) otevřít formulář a naplnit ho daty z DB - což je až ve fragmentu, ale v jiné aktivitě. Takže pokud aktivita pro zobrazení fragmentu s formulářem vypadá takto:
    public class AddRecordActivity extends FragmentActivity implements
        AddRecordFragment.OnAddRecordListener {
        
        public static final String EXTRA_DATE = "date";
        public static final String EXTRA_DAILY_COUNTER = "dailyCounter";
        public static final String EXTRA_MAIN_COUNTER = "mainCounter";
        public static final String EXTRA_DESCRIPTION = "description";
        
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.add_record_container);
        }
    
        @Override
        public void onAddRecord(Record record) {
            Intent result = new Intent();
            result.putExtra(EXTRA_DATE, record.dateInMillis);
            result.putExtra(EXTRA_DAILY_COUNTER, record.dailyCounter);
            result.putExtra(EXTRA_MAIN_COUNTER, record.mainCounter);
            result.putExtra(EXTRA_DESCRIPTION, record.description);
    
            setResult(RESULT_OK, result);
            finish();
        }
        
    }
    

    a v hlavní aktivitě se tato aktivita otevírá takto:
                Intent i = new Intent(this, AddRecordActivity.class);
                i.putExtra(AddRecordActivity.EXTRA_DATE, record.dateInMillis);
                i.putExtra(AddRecordActivity.EXTRA_DAILY_COUNTER, record.dailyCounter);
                i.putExtra(AddRecordActivity.EXTRA_MAIN_COUNTER, record.mainCounter);
                i.putExtra(AddRecordActivity.EXTRA_DESCRIPTION, record.description);
                startActivityForResult(i, REQUEST_UPDATE_RECORD);
    

    tak tam budu muset dělat dalšího prostředníka pro přenesení dat do fragmentu.
    DATEL
    DATEL --- ---
    DRIZDIK: breaknout myslíš hodít si breakpointy pro debugger? No, ona ta výjimka je jen občas, zkouším otevírat dialogy, zavírat je atd. a vyskytne se to jen občas. Hlásí, že se finalizuje kurzor, který nebyl deaktivován nebo uzavřen. Problém je, že se to vyvolá jen někdy. Dle jedné situace jsem myslel, že se při otevření nové aktivity s tím fragmentem a formulářem nevyvolají onPause atd. pro fragment se seznamem a pak, když uložím novou položku, tak se vyvolá update seznamu, kde se vytváří znova kurzor a tom to vyhodí tu výjimku. Jenže už se mi i stalo, že mi to tu samou výjimku do LogCatu vyhodilo i ve chvíli, kdy jsem měl otevřený ten formulář pro novou položku a z něj otevřel ještě dialog pro výběr datumu - tady teda moc nechápu, proč se obnovoval seznam. Blbý je, že to je všechno náhodně, nedá se to přesně replikovat, takže nějaké ladění v debuggeru asi mi moc nepomůže :(
    Kliknutím sem můžete změnit nastavení reklam