• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    LWEEKAndroid development
    DACAN
    DACAN --- ---
    vtipnej javadoc :)
    platform_frameworks_base/services/java/com/android/server/power/ElectronBeam.java at master · android/platform_frameworks_base · GitHub
    https://github.com/...orks_base/blob/master/services/java/com/android/server/power/ElectronBeam.java
    DATEL
    DATEL --- ---
    DRIZDIK, DRIZDIK: super, díky moc za objasnění! Jdu zrušit předávání entity přes argumenty :)
    DRIZDIK
    DRIZDIK --- ---
    DRIZDIK: Tam si ale zase hodně fieldů už stavu udežuje samo, protože na každém view se volá onSaveInstanceState automaticky, ale když máš třeba nějaký robalovačky v layoutu nebo složitější logiku, tak si stav uložíš pomocí onSaveIntance
    DRIZDIK
    DRIZDIK --- ---
    DATEL: b) je správně ;-)
    saveInstance je na fragmentu třeba pro formulářový pole, který bys měl změněný oproti původnímu stavu a další věci nezávislý na datech (entitě), entitu určitě nedávat do saveInstance.
    Arguments je třeba kdybys měl list entit a chtěl říct, že tenhle fragment zobrazuje ID 10, tak si desítku předáš v arguments, změníš jeden field a otočíš displej, tam je saveInstance na řadě
    DATEL
    DATEL --- ---
    DRIZDIK: DRIZDIK: díky za objasnění. Akorát mi teda do toho zas nepasuje ten můj původní problém, že z aktivity předávám entitu do fragmentu přes Parcelable objekt a pak ji znovuvytvářím. Jsou tedy dvě možnosti:

    1. skutečně používat pro entitu Parcelable, a to jak při vytváření fragmentu (getArguments), tak při ukládání stavu (onSaveInstanceState)

    2. krom jiných způsobů použít třeba to co jsem psal, tj. aktivita implementuje rozhraní, které fragment vynucuje (kontrola v onAttach), a pak si fragment sám načte entitu z aktivity, ukládá do ní data, a tedy není potřeba (pokud to není potřeba pro jiná data) entitu ukládat pomocí onSaveInstanceState a vytvářet pomocí getArguments atd. Akorát teda... když to tak píšu, tak to asi není úplně správné řešení z hlediska používaných vzorů, ikdyž je to zase rychlé a jednoduché řešení.

    Je obecně akceptovatelný postup bodu 2?
    DRIZDIK
    DRIZDIK --- ---
    Dulezity je tam, ze se budes spolehat pouze na neparametricky konstruktor.
    DRIZDIK
    DRIZDIK --- ---
    DATEL: Nainicializujes z Arguments a pokud neni null, tak prepises z savedInstance
    DATEL
    DATEL --- ---
    DRIZDIK: takže v onCreateView mám v podstatě dva vstupy - parametr Bundle savedInstanceState, který bude naplněn, pokud implementuju onSaveInstaceState() a něco tam předám, a pak pomocí metody getArguments() můžu získat jiný Bundle. Přednost by měl mít ten ze savedInstanceState parametru, pokud je naplněn. Což mi ale nezaručuje stejný způsob vytvoření fragmentu, ne? V argumentech z getInstance() může být úplně něco jiného než když něco uložím v savedInstanceState... Tak teď vlastně nevím, jak bych to měl správně použít, aby to bylo konzistentní - do savedInstanceState bych měl ukládat minimálně to samé, co je v argumentech?
    DRIZDIK
    DRIZDIK --- ---
    DATEL: Nutí (umoňuje) ti to zpracovat jak obnovení, tak vytvoření fragmentu stejným zůsobem. Fragment musí mít bezparametrický konstruktor, aby ho mohl systém obnovit v případě jeho zavření a arguments ti mezi tím udrží.
    DATEL
    DATEL --- ---
    Díky, nakonec jsem to udělal tak, že v base aktivitě / fragementu inicializuju potřebné věci ke GA a pak jen v konkrétních aktivitách / fragmentech zavolám hit. Nechceme totiž sledovat úplně všechno.

    Ještě bych se vrátil k mému předchozímu dotazu (DATEL, DRIZDIK) - proč se vlastně používá pro vytvoeřní fragmentu ten vzor přes statickou getInstance() metodu, kdy se jí předávají v parametrech vstupní data, metoda vytvoří instanci a přes argumenty předá do fragmentu? To samé přece můžu udělat přímým voláním konstruktoru s těmi samými parametry...
    Jediné, co mě teda napadá, je nějaká možnost ukládání stavu fragmentu a jeho obnovy automaticky systémem, kdy ukládá vše co je v Bundle objektu (přes getArguments()) - ale jestli to tak skutečně je, to netuším. Ale tohle asi nebude ono, fragment může být zrušen i během práce, tj. data na základě vstupních parametrů už můžou být změněna, tj. ono uchování stavu je podle mě stejně třeba dělat ručně přes onSaveInstaceState() a pak v onCreate() (apod.) obnovit.
    Takže mi stejně u použití getArguments() a getInstance() není jasné, v čem je přínos... Proč tedy?
    ROTTWEILER
    ROTTWEILER --- ---
    DATEL: Stačí udělat něco typu BaseActivity, od které oddědíš a do ní dáš kód na trackování.
    DRIZDIK
    DRIZDIK --- ---
    DATEL: Opravdu to zapíná automatický logování View události pro zobrazení aktivity. Mně funguje správně. Zkoušels to přes "V reálném čase", jestli se tam zobrazuješ?
    DATEL
    DATEL --- ---
    DATEL: hm, tak klasika, hodinu pátrám na netu, nic, napíšu dotaz do diskuzáku a vzápětí najdu odpověď na netu :)

    Takže, nejspíš jde o nějaký bug v SDK, je nutno zavolat nad instancí GoogleAnalytics ještě enableAutoActivityReports(), pak to funguje.

    Google Analytics for Android v4 - Automatic Screen Measurement not working? - Stack Overflow
    http://stackoverflow.com/...google-analytics-for-android-v4-automatic-screen-measurement-not-working

    a posléze

    android - enableAutoActivityTracking not automatically tracking activities? - Stack Overflow
    http://stackoverflow.com/...activitytracking-not-automatically-tracking-activities/23256722#23256722

    Nicméně jsem zjistil, že to je stejně až od API 14, a protože máme aplikaci od API 9, tak to budu muset dělat ručně.
    DATEL
    DATEL --- ---
    DRIZDIK: díky za tip... Vzhledem k tomu, že na vývoj je málo času, tak asi zatím použiju tu variantu, kdy aktivita má k dispozici metodu "getEntity()", kterou si fragment zavolá a získá tak stejnou instanci objektu + po všech změnách v entitě pak fragment zavolá v aktivitě metodu pro oznámení změny.
    DATEL
    DATEL --- ---
    Měl bych otázku ohledně Google Analytics SDK - není mi jasné, jak pracuje volba "ga_autoActivityTracking", když ji zapnu. Podle popisu mám za to, že nepotřebuju pro Aktivity ručně vyvolávat Hit, tj. jak mám u fragmentů:

    mTracker.setScreenName("xxxxxx");
    mTracker.send(new HitBuilders.AppViewBuilder().build());

    a mělo by to být automaticky. Jenže v logu nic nevidím, že by se dělo. Při ručním hitu z fragmentu to tam zaloguje, ale když jdu na aktivitu, tak nic. Asi jsem tuto funkcionalitu špatně pochopil, můžete mi to prosím někdo objasnit? Musím tedy i v těch aktivitách vyvolat ten Hit ručně? K čemu potom to automatické trackování je dobré?
    DRIZDIK
    DRIZDIK --- ---
    DATEL: Já tohle řeším v případě kontextu aktivity EventBusem, například OTTO nebo RoboGuice ho má v sobě. Udržuješ si jen jeden datový objekt a posíláš si události o jeho změnách.
    O jeho instanci se mi stará DI kontejner.
    Pomocí parcelable se ti opravdu vytvoří dvě rozdílní instance.
    Co se týká implementování rozhraní na aktovitě, přináší to pro mě hroznej bordel do kódu a hlavně střešněj tight-coupling
    Ty události ti umožní i jednoduchý testování, přenesení fragmentu jinam, jeho oddělené zobrazování atd.
    DATEL
    DATEL --- ---
    Ahoj, řeším tu teoretický problém ohledně komunikace mezi aktivitou a fragmentem. Jde mi o to, že potřebuju pracovat s datovým objektem jak v aktivitě, tak ve fragmentu (respektive více fragmentech). Jde mi o obousměrnou komunikaci, tedy přesněji řečeno úpravu dat toho předávaného objektu.

    Všude na netu jsou dva oddělené postupy:

    1. předání dat z aktivity do fragmentu, pomocí newInstance() fragmentu, parcelování daných dat a předání do nově vytvořené instance argumentem.

    2. předání dat (lépe řečeno komunikace) z fragmentu do aktivity pomocí rozhraní, které implementuje aktivita, pak fragment volá metody této aktivity.

    A teď, je mi poněkud proti srsti používat to parcelování objektu, jestli to dobře chápu, tak vlatně ve fragmentech pak dochází k vytvoření kopie dle předaných dat, tj. je to jiná instance datového objektu. Správnější mi přijde pracovat pouze s jednou instancí datového objektu, který by šel předat teoreticky v konstruktoru fragmentu, ale protože se doporučuje užití vzoru s tím newInstance(), tak bych to spíš viděl tak, že interface pro aktivitu bude mít metodu getEntityData(), kterou si fragment zavolá při vytvoření (třeba v onCreateView), tím získá odkaz na instanci objektu z aktivity. Do ní může přímo ukládat upravené data (a taky je načíst).

    Tohle bude podle mě hezky fungovat v případě, že mám zobraz jen jeden fragment. V případě layoutu pro tablety, kde je zobrazeno více fragmentů najednou, by už došlo k nekonzistenci, ale to se dá vyřešit zavoláním nějaké refresh metody.

    Když pominu tento problém, mohl by být ještě nějaký další? Nejde mi prostě do hlavy, proč se pracuje takhle krkolomně s kopiemi objektů (a všude je to takhle doporučováno) - je to přece i režie navíc, objekt se musí rozložit, poslat data fragmentu, tam vytvoři nový objekt z daných dat...
    P19
    P19 --- ---
    MRAKY: Aha! Docela dobrá informace! Díky, kouknu na to!
    MRAKY
    MRAKY --- ---
    P19:
    P19:
    spustil sis spatny emulator. To co jsi tu pastul je weareable emulator ... takhle podle google budou vypadat hodinky...
    naklikej si 4.4 emulator pro telefon.
    P19
    P19 --- ---
    MAKROUSEK: Mám BlackBerry :D
    REDGUY: Genymotion vyzkouším, vypadá to dobře. Díky
    Kliknutím sem můžete změnit nastavení reklam