Android, Kotlin: hogyan érem el a MainActivity objektumait más Activity-ből?

Android, Kotlin: hogyan érem el a MainActivity objektumait más Activity-ből?
2022-02-18T11:56:47+01:00
2022-02-19T18:55:05+01:00
2022-10-15T21:21:37+02:00
XtraP
A címben a lényeg, de részletezem.

Adott egy mindősszesen párszáz Kotlin-sornyi app, a MainActivity-n kívül két további Activity-vel.
Szeretném a preferenciákat ("Preferences") induláskor betölteni, és módosulások alkalmával elmenteni (mindösszesen kb 5 Double-ról van szó). Ehhez kezdetnek a MainActivity-ben a következő sort helyeztem el:

val sharedPref = getPreferences (Context.MODE_PRIVATE)

A mentendő/visszatöltendő adatok azonban a további Activity-kben keletkeznek/módosulnak, így erre az objektumra onnan kellene hivatkoznom. A netes keresés egymásnak ellentmondó, de jórészt gyanúsan összetett megoldásokat hozott.

Kérdéseim:

a) hogyan tudom ezt az említett hivatkozást megoldani, hogy tehát a jelzett 'sharedPref' objektumot a mellék-Activitykben is felhasználhassam? (egyáltalán, értelmes ötlet ez?)

b) vagy minden Activity számára csináljak külön getPreferences-példányt? Nem látom át, hogy abban az esetben az adatok app-szinten egyetlen, konzisztens fájlba kerülnek-e.

c) maguk a mentendő adatok egy nem-Activity-hátterű, közönséges Kotlin-fájlban vannak definiálva, tehát azokat az app minden objektuma látja. Gondoltam arra, hogy a getPreferences-példányt is oda helyezzem, de (természetesen?) 'Unresolved reference'-t kapok. Esetleg mégis járható lenne ez az út valami import vagy segéd-objektum bevetésével?

Köszönöm!
Mutasd a teljes hozzászólást!
A legegyszerubb, ha minden activityben csinalsz egy uj sharedpreferences instancet es elmented amit szeretnel. Ennek persze feltetele, hogy a sharedpreferences file tartalma szamodra ertelmezheto legyen akkor is, ha csak az egyik adatot frissitetted, de 3 masikat nem.

A masik ut, amit irtak, hogy amikor az “A” activityrol atmesz a “B” activityre, akkor viszed magaddal a modositott adatokat es ott mented el, ahol minden adatod megvan.

Azt nem javaslom, hogy az “A” activity barmilyen publikus valtozoja is hivatkozzon a B activityre, mert amint masik activity kerul eloterbe a korabbi activity-t “megszunteti” az operacios rendszer, de ameddig van ra hivatkozas, addig nem tudja es memory leak lesz belole. Ez igy most nagyon egyszeruen van megfogalmazva, de a lenyege ugyanaz.
Mutasd a teljes hozzászólást!

  • Ez mondjuk java, de szerintem az android stúdió átalakítja.

    Intent intent=new Intent(MainActivity.this,year_second_semester.class); intent.putExtras("sum",sum); startActivity(intent);
    Mutasd a teljes hozzászólást!
  • A legegyszerubb, ha minden activityben csinalsz egy uj sharedpreferences instancet es elmented amit szeretnel. Ennek persze feltetele, hogy a sharedpreferences file tartalma szamodra ertelmezheto legyen akkor is, ha csak az egyik adatot frissitetted, de 3 masikat nem.

    A masik ut, amit irtak, hogy amikor az “A” activityrol atmesz a “B” activityre, akkor viszed magaddal a modositott adatokat es ott mented el, ahol minden adatod megvan.

    Azt nem javaslom, hogy az “A” activity barmilyen publikus valtozoja is hivatkozzon a B activityre, mert amint masik activity kerul eloterbe a korabbi activity-t “megszunteti” az operacios rendszer, de ameddig van ra hivatkozas, addig nem tudja es memory leak lesz belole. Ez igy most nagyon egyszeruen van megfogalmazva, de a lenyege ugyanaz.
    Mutasd a teljes hozzászólást!
  • Köszönöm az infót. Végülis az activity-nkénti külön példány mellett döntöttem. A szóbanforgó adatok egymástól függetlenül használhatók, tehát ez a megoldás most megfelel.

    Jellemző amúgy a beginner státuszomra, hogy az

    amint masik activity kerul eloterbe a korabbi activity-t “megszunteti” az operacios rendszer

    tényére épp egy napja jöttem csak rá, amikor ráébredtem, hogy a MainActivity OnCreate eseménye  egy session-on belül is mindannyiszor lefut, ahányszor oda visszalapoz az app. Megvallom, traumatikus élmény volt ...

    BTW az 50 pont megosztására nincs lehetőség? Bzzs válasza is érdemi volt.
    Mutasd a teljes hozzászólást!
  • Köszönöm a választ; a Kotlin-ra átültetés valóban nem volt túl problémás. Megvallom őszintén, az Intent számomra (kezdőként) még sötét ló volt, de a megoldásod nyomán legalább beleástam magam egy kicsit.
    Amiért itt most nekem végülis nem vált be, az az, hogy ha jól érzékelem (lehet, hogy ez másnak természetes, nekem nem volt az), a startActivity a megcélzott activity-nek a képernyőjére is átvált, ami viszont nekem nem lenne szükséges, sőt. (Kezdő vagyok, na.)

    Mindamellett az infó távlatilag igen hasznos volt, köszönöm.
    (Ha meg tudtam volna tenni, megosztom az 50 pontot.)
    Mutasd a teljes hozzászólást!
  • En nem a pontokert csinalom, ugyhogy nyugodtan adhatod barkinek :)


    Az android activity/fragment lifecycle-t jol ismerd meg, mert kulonben nagyon sokat lehet a nem ismerete miatt szivni.
    Itt van rola, hogy jo abra:
    https://miro.medium.com/max/952/1*UWTA4pWxMjz32Kisy0sjhQ.png
    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