Android: egyik View metódusából indított rajzolás másik View-be

Android: egyik View metódusából indított rajzolás másik View-be
2022-10-20T22:37:50+02:00
2022-10-23T19:03:13+02:00
2022-10-23T19:20:36+02:00
XtraP
Kérdésem bizonyára egyszerű, de én sajnos nem ismerem a megfejtést.

Egy képernyőn (egy Fragment ConstraintLayout-ján belül) van két View (mindkettő a rendszer View osztályának közvetlen leszármazottja). Azt szeretném elérni, hogy ha az egyik View-ban a felhasználó megbök egy pontot, akkor - túl az aktuális View-ban elvégzendő feladat végrehajtásán - a másik View felületén is megjelenjenek változások. Mi ennek a gyakorlati, bevett, működő módja? 

Konkrétan arról van szó, hogy az egyik View egy térképi útvonal (semmi Google Map vagy OpenStreetMap; egy .GPX (XML-) fájl beolvasott adataiból készült közönséges, canvas.drawPath felhasználásával rajzolt vonalas ábráról van szó), a másik View pedig az útvonal magasságprofilja (szintén drawPath, vonalas). Azt szeretném elérni, hogy amikor a felhasználó megjelöl egy pontot az útvonalon, akkor azon, és a magasságprofil megfelelő helyén is jelenjen meg egy kis karika, illetve ha a magasságprofilon koppint, akkor azon, és az útvonalon is jelenjen meg a megfelelő jel. A saját View-re mindkét funkció kifogástalanul működik, de egyik View metódusaiból a másik metódusait meghívva a köröcske nem jelenik meg.

Debug révén tudható, hogy a koordinátákat kiszámító eljárás lefut, a társ-View onDraw metódusa fel is dolgozza a kért adatokat és a kirajzoló eljárást is lefuttatja a megfelelő koordinátákon (amiken saját maga is rajzolna, de a saját műve látható is), utána a megfelelő View postInvalidate() metódusa is lefut, de a képernyőn nem jelenik meg semmiféle változás.
Magyarán "B" View metódusainak ugyanaz a sorozata, amit "B" View eredményesen használ a kirajzoláshoz, az "A" view metódusából meghívva lefut ugyan, de látható eredmény nélkül.

Mit csinálok rosszul?
Mutasd a teljes hozzászólást!
Minden megoldhato :)
De ettol fuggetlenul en nem kotnem ossze ilyen modon a View-kat kozvetlenul, hanem mindenkepp csinalnek egy olyan reteget, aki kontrollalja az osszes View-t. Ez azert is tud hasznos lenni, mert kesobb a View-t szabadon cserelheted, a tobbi business logic teljesen fuggetlen marad tole.
Mutasd a teljes hozzászólást!

  • Kod nelkul nehez megmondani, hogy mit csinalsz rosszul, de a legegyszerubb, ha csinalsz egy sajat View implementaciot es egy interface-el tudsz kommunikalni a Fragmenttel, ami a masik View-nak tud szolni, hogy csinalni kene valamit.

    Vagy databinding segitsegevel is megoldhato.
    Mutasd a teljes hozzászólást!
  • Sejtettem, persze, hogy kód nélkül nem egyszerű ... a helyzet az, hogy a program már meglehetősen összetett, és (nem vitatom, hogy nagyrészt programozói amatőrség miatt is) elég macerás lett volna lenyesegetni az irreleváns részeket úgy, hogy a maradék futtatható vagy egyáltalán, egyszerűen áttekinthető legyen.
    A View-k egyébként (mindkettő) saját implementáció, külön Kotlin fájl, hozzá a Layout-ok, a Fragment-fájlok, a MainActivity ...

    Most már alapvetően az érdekelne, hogy elvében nem hajmeresztő-e az ötlet: egyik View-ből egy másikban megjelenítést kezdeményezni ez utóbbi View eljárásait meghívva. 

    Az Androidot még mindig csak tanulgatom, egy sereg dolgot nem ismerek és nem látok át; szégyen ide vagy oda, az interface és a data binding (még) ezek közé tartoznak. De köszönöm a javaslatot, beleásom magam. Ha az aktuális hiba netán egyszerű ügy lenne is, ezekkel - tudom - mindenképp meg kell ismerkednem.

    Köszönöm!
    Mutasd a teljes hozzászólást!
  • Minden megoldhato :)
    De ettol fuggetlenul en nem kotnem ossze ilyen modon a View-kat kozvetlenul, hanem mindenkepp csinalnek egy olyan reteget, aki kontrollalja az osszes View-t. Ez azert is tud hasznos lenni, mert kesobb a View-t szabadon cserelheted, a tobbi business logic teljesen fuggetlen marad tole.
    Mutasd a teljes hozzászólást!
  • Köszönöm :)

    Hogy rutinos ember nem így csinálná, az sokat elmond; vettem az adást. :)
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd