• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    LWEEKAndroid development
    ADAMH
    ADAMH --- ---
    JOHNY_G: Je to asi dost poznat :)

    K příkladu co chci docílit. Mám svoji api třídu, která získává data z internetu či je tam ukládá.

    - intro fragment - který přes api získá data, jakmile je získá zobrazí část těchto dat a tlačítko pokračovat
    - home fragment - tam se zobrazí volby (switche) co si uzivatel nastavi a pak stiskne tlačitko na začít pracovat
    - pracovni fragment - tam se to cele provadí na zaklade dat z api tj intro fragmentu a i na zaklade toho co si nastavi uzivatel v home fragmentu pres ty switche a posleze se pres api neco ulozi

    To jak jsi to psal mě začíná případat logické, ale představoval bych si (což je asi špatně), že ta data budu mít uložena v aktivite a fragmenty je budou menit ci doplnovat dle potřeby.

    Předpokládám teda, že správně to je tak ze z activity se do fragmentu pošle v zásadě jen úvodní dávka informací při otevření a to je vše. A do activity se vicemene nic neposila.
    JOHNY_G
    JOHNY_G --- ---
    ADAMH: Já jsem se ztratil taky. Předpokládám, že Android není zrovna tvoje domovina, stejně jako Java, takže jsem zabloudil už u deskriptoru :-)). Předpokládám, že mluvíme o referenci, což už takhle na začátku vypadá na křehkou architekturu, protože fragment a aktivita nemají dokonale synchronizovaný životní cyklus, takže si koleduješ o IllegalStateException, navíc ostré reference na context (v tomto případě aktivita) nevyhnutelně vedou k memory leakům. Aktivita by měla řídit jen životní cyklus, a sice na úrovni aktivity, tedy nad fragmentem (např. spouštím jinou aktivitu, jinou aplikaci, zobrazuji dialog). Fragment by měl být soběstačný, a když po aktivitě něco chce, má na ní nullable getter getActivity(), popř. unsafe non-null requireActivity(). Nemyslím si, že by aktivita měla kdy něco chtít po fragmentu (vstupní parametry obstarají Safe Args v navigation components, popř. getInstance() a arguments bundle), tudíž neshledávám důvod k obousměrné komunikaci. Zejména, když používáš nav controller, pro který si fragment umí sáhnout sám přes findNavController(). Počítám, že MVVM nepoužíváš, takže budeš mít ve fragmentu i business logiku a tudíž ti odpadá ta relevantní oboustranná komunikace mezi fragmentem a viewmodelem. Můžeš uvést příklad svého use case? Vyzkoušený tutorial nemám, protože jsem se to učil při práci na již navrženým projektu postaveném na Android Clean Architecture (extrémně nedoporučuji!) a já jsem si z ní pro svoje projekty odnesl jen to, co jsem považoval za funkční :-).
    ADAMH
    ADAMH --- ---
    JOHNY_G: Ač nejsem začátečník, tak uznám, že se v tom ztrácím. Já si zpravidla do fragmentu přenesu deskriptor activity z activity volam přes deskriptor fragmentu. S navcontrolerem se to zdá být obtížnější. Neřeším znovpoužitelnost aplikace ale to aby fungovala.

    Bohužel těch návodu na internetu je hodně, ale je to jak kdy kotlin či java (dělám v jave), často je to návod na vieparger, často jen na nějaký základní přenosy dat a jen jedním směrem. Pro mě chaos.

    Nemáš náhodou někde opravdu funkční ukázku s navcontrolerem v jave na obousmernou komunikaci?
    JOHNY_G
    JOHNY_G --- ---
    Já s fragmenty nemám problém. Používám je s architecture a navigation components k takřka plné spokojenosti. Jediný problém mám s nav controllerem a jeho správou back stacku, ale člověk si zvykne. V MVVM není obvykle nad rámec občasných argumentů (které nav controller podporuje) ke komunikaci mezi fragmenty důvod. Na logiku přesahující potřeby obrazovky/fragmentu/viewmodelu typicky používám nějaký provider (dle potřeby singletonový nebo instancovaný přes factory) a/nebo repository.
    ADAMH
    ADAMH --- ---
    Bude to znít asi jako začátečnícký dotaz, ale i tak to zkusím.

    Máte rádi fragmenty? Mě se jeví značne nefunkční a obzvláště komunikace mezi nima a celková funkčnost aplikace se stává velmi složitou a méně funkční než když se dá jen jedna activita bez fragmentu. Obzvlášt těd co jsem zkusil udělat appku s navcontrolerem namísto fragment manageru.

    Navíc protěžovaný kotlin čímdál víc zabírá misto původní jave ve smyslu různých howto apod.
    DATEL
    DATEL --- ---
    Ahoj, zoufalý dotaz. Děláte někdo widgety? Mám tu záhadu, nad kterou sedím už dvě hodiny, zkouším kde co a bez výsledku. Ve vlastní třídě poděděné z AppWidgetProvideru mám onUpdate(). Ten je v android knihovně interně volaný z onReceive(), když přijde android.appwidget.action.APPWIDGET_UPDATE - tato událost by dle dokumentace měla přijít např. po rebootu, restartu aplikace nebo když je dosažen časový limit nastavený v konfiguraci appwidget-provider přes updatePeriodMillis. Podotýkám, že to mám nastavené na 0.

    A teď, úplně jsem vyházel kód, zůstala jen holá kostra. V tom onUpdate() volám:

    val refreshWorkRequest = OneTimeWorkRequestBuilder<RefreshWidgetWorker>()
    WorkManager.getInstance().enqueueUniqueWork(REFRESH_WORKER_TAG, ExistingWorkPolicy.KEEP, refreshWorkRequest)

    uvnitř toho RefreshWidgetWorkeru je doWork, který teď nic nedělá, jen vrátí Result.success()

    A teď ten problém - zavolání toho enqueueUniqueWork způsobí to, že je v tom widget provideru neustále vyvoláván onUpdate(), tj. do onReceive() chodí ta akce action.APPWIDGET_UPDATE - a vůbec nechápu proč. Když to volání enqueue metody vyhodím, je to v pohodě. Způsobuje snad vyvolání nějakého "procesu" na pozadí to, že do widgetu jde znova ten Intent? Je otázka, jestli nový nebo původní?
    LWEEK
    LWEEK --- ---
    JOHNY_G: Ha ha, dík :-)
    JOHNY_G
    JOHNY_G --- ---
    LWEEK: Počítám, že už jsi na pokraji šílenství z takového úkolu všechna čistá řešení s propagací eventů vyzkoušel, takže to zkusme ručně :-D. Musíš se progetovat k příslušné Drawable (nevím, jestli to máš jako background, src, nebo kýhočerta) a na ní zavolat setState(new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled}) a třeba za čtvrt sekundy zase reset na setState(new int[]{}). Když najdeš RippleDrawable (na API 21+), tak si to můžeš vycastovat a zaměřit pomocí setHotspot(0.5f, 0.5f) (aspoň myslím, že jsou to relativní souřadnice, to už si vyžehlíš). Pěkná čuňárnička :-).
    LWEEK
    LWEEK --- ---
    Tak jsem to vyřešil, ale přišel jsem o ripple efekt. Netušíte jestli jde nějak zobrazit na parentu ripple efekt pokud dojde ke clicku v childu?
    LWEEK
    LWEEK --- ---
    Vyrábím tabulky. Potřebuju aby se to scrolovalo horizontálně i vertikálně. Ale aby to bylo vtinější mám tam takzvané sticky sloupce které mohou být nalevo i napravo. Ale potřebuju aby když uživatel klikne kamkoliv tak to zaznamenalo klik "na řádek" a zároveň aby fungoval vnitřní scroll a tlačítka které mohou být vnořené jak v prostřední horizontálně scrollovacím view tak i v těch postraních. Už mi z toho malinko hrabe. :)
    JOHNY_G
    JOHNY_G --- ---
    LWEEK: Interceptovat můžeš, ale pokud to nechceš zkonzumovat, tak musíš vrátit false, tím pádem ty eventy probublají dál.

    Většinu podobných bolehlavů vyřešíš tím, že vyměníš ScrollView za NestedScrollView, který má většinu podobných scénářů ošetřenou. V ideálním případě upravíš návrh tak, aby tam nesting vůbec nebyl (neznám tvůj use case, ale v případě HorizontalScrollView může být alternativou ViewPager), ale ne vždycky to jde, a vždycky je to opruz :-)).
    LWEEK
    LWEEK --- ---
    OK, tak pokrok. Už vím že bych dispatchTouchEvent neměl používat a měl bych použít onInterceptTouchEvent. Jenže pořád tam je ta otázka. Jak odchytit klik aniž bych tím zabil scrolování vnořeného HorizontalScrollView. Protože jakmile pošlu MotionEvent.ACTION_DOWN tak si to převezme ScrollView a mám smůlu. Když si ACTION_DOWN interceptnu tak to funguje ale zabiju tím scrollování. Takže mi pořád uniká klíčový pattern.
    LWEEK
    LWEEK --- ---
    Snažím se pochopit jak Android zpracovává doteky. Co jsem pochopil:
    - touch bublá skrze hirearchii z window dolu do views (dispatching)
    - pak bublá zpátky přes (onTouch) ...

    Co nechápu je intercepting.

    Co potřebuju vyřešit.

    Mám RecyclerView .. v něm mám row s LinearLayoutem a v něm mám HorizontalScrollView. Ten HSV si bere veškerý touch který potřebuju detekovat v LinearLayoutu. Potřebuju poznat že jde o click a pak to gesto neposlat dolu a zachytit ho v LinearLayoutu.

    Jenže teď jak na to když MotionEvent je nejprve DOWN, pak MOVE a pak UP. Jenže klik umím zjistit až ve chvíli kdy je event UP a to je už pozdě protože v tu chvíli si ty eventy už konzumuje HSV. Nějaký nápad nebo pattern jak se tohle běžně řeší?

    Díky!
    LWEEK
    LWEEK --- ---
    Zdravím, zase mám problém. :) Mám ConstraintLayout a v něm HorizontalScrollView .. a na tom ConstraintLayoutu mám onClickListener ale je "hluchý". Je možné, že touch konzumuje HorizontalScrollView. Jinak si to neumím aktuálně vysvětlit. Dá se tomu nějak předejít aby nekonzumoval a posílal dál?
    JVCNC
    JVCNC --- ---
    S klavesnici a layoutem jsem se sral tak dlouho az jedine uspokojive reseni byla klaveanice vlastni s polem kde se mi zobrazuje to co vlastne pisu, do te doby strasnej provlem protoze ne vsechna poleuzou byt nahore aby byla videt i s klavesnici
    DRIZDIK
    DRIZDIK --- ---
    MIKULAS: Přesně, mě štve i ten WhatApp co si tam tu notifikaci občas hodí, aby neměl označenou práci za podezřelou.
    JOHNY_G
    JOHNY_G --- ---
    MIKULAS: Ja si je prepinam na silent & minimized, taky nemam rad nahore ikonky. Ale mas samozrejme pravdu. Vysvetlit to uzivatelum je nadlidsky vykon a radsi to smazou :-).
    MIKULAS
    MIKULAS --- ---
    JOHNY_G: a když přece vyhraješ, tak to bude muset být super-mega-užitečná appka, aby se uživatelé byli ochotni stále koukat na tu sticky notifikaci - což je většinou nepřekonatelný UX problém - lidé mají rádi to oznamovací centrum vyčištěné
    JOHNY_G
    JOHNY_G --- ---
    DATEL: Řešili. Můžeš se dostat poměrně daleko, když to bude foreground s persistentní notifikací, bude STICKY, a když uživatele provedeš až do nastavení systému, ale nikdy nevyhraješ úplně :-(. U některých výrobců nevyhraješ nikdy. Musíš využívat času, kdy je aplikace v prostředí, a tu servicu si znovu nakopnout.
    DATEL
    DATEL --- ---
    DRIZDIK: Prave ze jak to vypada dle logu, tak Doze mode se mi spusti i v te foreground service. Zkusim jeste vypnout optimalizaci baterie pro tu aplikaci (Honor ). A diky za ten tip na ACTION_REQUEST, kouknu na to, co by to melo umet.
    Kliknutím sem můžete změnit nastavení reklam