Hirdetés
- Fujifilm X
- NVIDIA GeForce RTX 5080 / 5090 (GB203 / 202)
- CES 2026: jön az AMD CES előadása és az NVIDIA GeForce ON
- Milyen videókártyát?
- A legrosszabb CPU-k – az ExtremeTech szerint
- OLED TV topic
- Hogy is néznek ki a gépeink?
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- eGPU tapasztalatok
- HiFi műszaki szemmel - sztereó hangrendszerek
Új hozzászólás Aktív témák
-
bandi0000
nagyúr
Köszi vég is már sikerült megoldani, már csak 1-2 dologgal küzdök
Igazából bonyolultabbnak tűnik a tied egyértelműen, én elég egyszerűen megoldottam az import és exportot, és működik is, mindkettőben csak a FileUtilst-t használom
Inkább az a problémám, hogy én úgy csináltam, hogy fix helyre ment, és fix helyről olvas, de úgy kellene megoldani, hogy a user adhassa meg az útvonalakat, na már most én már egyszer megpróbáltam, de mikor kiválasztom a Db fájlt, akkor hibát dob, miszerint nem ismeri fel a fájlt, meglehetne ezt úgy oldani, hogy nem egy konkrét fájlt, csak egy mappát kelljen kiválasztania, és ott persze hozzáfűzném a DB nevét amit majd másol?
-
t181
senior tag
Nem feltétlenül probléma, hogy az onDestroy nem fut le. onDestroyView-ban ugye szétszedi a View-t és sok referenciát elenged (pl leiratkozik az Observer-ekről). Profiler-rel figyeld a memóriahasználatot, abból kiderül, hogy okoz-e galibát a sok Fragment.
"Pontosan ezért nem szerettem volna minden ablaknak külön háttérszálat nyitni."
Hogy használod a háttérszálakat? Hogy hozod létre őket? Mire használod?
-
[KgP].Robot
aktív tag
Szia
Koszonom a segitseget, de ez nem megoldas sajnos. Vannak device-ok, ahol 3 ujjas swipe-al screenshot-ot lehet kesziteni. Ha ez be van kapcsolva az OS-ben, akkor abban a pillanatban, amikor a user 3 ujjat rateszi a kijelzore, az OS elkapja es nem adja tovabb senkinek(ekkor kapok ACTION_CANCEL-t). Szoval mire az event hozzam megerkezik, akkor az mar CANCEL. Ezt csak akkor tudom megoldani, ha az OS settingsben kikapcsolom ezt a gesture-t. -
thon73
tag
Még egy kérdés:
ViewPager-ben van egy olyan, hogy setOffScreenPageLimit()
Ez vajon el is tünteti a felesleges Fragmenteket/View-kat, vagy csak LEGALÁBB ennyit betölt előre?
Mert a log alapján az egyszer létrehozott fragmantek nem szűnnek meg soha. (Mármint megszűnnek persze, de nem a ViewPager miatt)
Pontosítok:
Lefut a pause, stop és destroyview; de a destroy nem.Más:
Az Android Studioban hol lehet beállítani, hogy a support könyvtárakban lévő metódusokról is (mint pl a setOffScreenPageLimit) adjon ki dokumentációs leírást? -
t181
senior tag
Tehát ha jól értem az adatbázisod olyan rekordokat tartalmaz, melyek mindegyikének van egy dátuma, a célod pedig, hogy egy-egy Fragment-en megjelenítsd az egyes hónapokba beleeső adatbázisrekordokat (valószínűleg listás nézetben).
Room és PagedList segítségével elég egyszerűen megoldható.
Kell egy olyan lekérdezés, ami paraméterben megadott év és hónap segítségével rászűr a szükséges bejegyzésekre ezt pedig egy PagedList LiveData formájában visszaadja. Erre az adott Fragment-ben feliratkozol és az eredményt átadod egy RecyclerView PagedListAdapter-ének.
Így nem kell szálakkal foglalkoznod, mindent megold magától.Következő Fragment-re navigáláskor pedig a jelenlegi alapján ki tudod számolni, hogy melyik hónap következik és át tudod adni a következőnek.
Ennek egy része találgatás, de talán el tudsz indulni.
Minden egyes fragment nyit egy külön háttérszálat?
Egyszerre hány Fragment-et hozol létre? ViewPager-t használsz, gombnyomásra ugrasz egyik hónapról a másikra, esetleg valami más?
-
Zalanius
tag
Ha jól sejtem, a setArguments megoldást keresed, a példákban legtöbbször egy static [***] newInstance() metódusból kiindulva magyarázzák el. Bővebben itt, keresd a DetailsFragment definíciós részét.
Ha app crash / forceclose utáni újraindulásra gondoltál, akkor ez tárgytalan.
-
Def26
félisten
Azóta változott a dolog. Kaptunk információt, hogy lehet pályázni applikáció készítésének finanszírozására max. 3 millió Ft -ra (közhasznú app. -ra), amit mi is megpályáztunk (csak cégek, magánszemélyek sajnos nem). Az állami keret sem kicsi és a pályázatíró szerint nagyon kevesen pályáznak rá, így nagy esély van, hogy összejöjjön. Ennek fényében újra kértük az ajánlatokat és hát el kell mondjam ez lett a varázsszó... szezám tárulj volt olyan cégeknél is akik előtte elhajtottak. Majd írom hogy éppen mivel haladunk.
-
Benex
senior tag
-
scream
veterán
Hali!
Én mostanában írtam egy sample Google TTS appot, nem egy nagy ördöngősség és egész normális a kiejtés is. Egyedül a kérdőmondatokkal van gond, illetve a gondolatjelekkel (nem szakítja meg a mondat folyamatosságát, hanem azt is csak darálja), de megoldható kis replace-el.
Másról sajnos én sem nagyon tudok.
-
fatal`
titán
Én elkülönítettet csináltam, de csak mert az első release idején még Magyarországról nem lehetett fizetős appot (se IAP-t) publikálni.
Most üzleti megfontolásból lehet, hogy inkább az in-app-purchaset választanám, mert szerintem több felhasználóhoz jut el a fizetős lehetőség és ezáltal többen is megveszik. Persze csak, ha értelmesen vannak kitalálva a funkciók és nem a lehúzásra megy a fejlesztő

-
domel
tag
Úgy néz ki, hogy megoldotta a problémám a memória csere, a 4GB lett cserélve 16GB-ra. A feladatkezelőben látom hogy folyamatos 4,5 GB a memóriaszint, ezért lehetett hogy folyamatosan töltött ha egyik applikációból mentem egy másikba. A 16 GB kicsit túlzás volt, emulátorral is csak 6,5 GB, és annak is elfogadható lett a sebessége. Amúgy mondták a szerelők, hogy lassan töltött be a windows annak ellenére, hogy egy erős gép, úgyhogy valami bibi lehet még, majd még ennek utánajárok.
-Domel
-
-
thon73
tag
Érdekes. Az interneten már mindent megválaszoltak, csak én nem tudok jól kérdezni.
Megint csak a teljesség kedvéért ezt találtam:
Detect 7 inch and 10 inch tablet programmatically
Hát, nem a világ legegyszerűbb feladata, ügyes volt aki ezt így végigszámolta.
-
-
domel
tag
Igazad lehet abban hogy a két string mutatója kavar be, de szerintem ez néha számít, néha nem

String k1="vava";
String k2="zaza";
. . .
public void frissit(View view) {
k2="vava";
if (k1==k2) {
mySound.start();
}
}Elvileg ez sem lehetne egyenlő ha a string mutatója szerint nézzük, márpedig lejátsza a zenét.
-
thon73
tag
Csak a teljesség kedvéért: találtam egy AppCompatPreferenceActivity-t ami részletesen megmutatja, hogy mely pontokon kell az AppCompatDelegate metódusait meghívni. Ezzel ugyanúgy működik, mint a "klasszikus" PreferenceActivity; lényegesen egyszerűsítve mindent.
Egy problémám azért továbbra is maradt: mivel ez PreferenceActivity és nem AppCompatActivity, lehetetlen meghívni a getSupportFragmentManager-t, vagyis nem lehet dinamikus fragmenteket alkalmazni. (Vagy: a nem-support változatot kell használni, de akkor mindenből.) Úgy láttam, erre a világhálón sincs válasz.
-
thon73
tag
Csak a teljesség kedvéért: megtaláltam a hibát. A "hagyományos" progress-bar már nem létezik, kellett egy új layoutot generálnom, ami tartalmaz egy progress-bar-t is. És ez működik mindentől függetlenül, appcompat alatt is. Azért érdekes ez az android világ. Az ember leporol egy évvel ezelőtt még jól működő programot, aztán puff; már semmi sem úgy van, mint akkor. Tudom, ezt hívják fejlődésnek.
-
[KgP].Robot
aktív tag
Köszönöm a válaszokat.
Közben kiderült, hogy úgy tűnik csak Samsung telókat érint a dolog.
Xiaomi Mi3-on nem jelentkezik a gond és más telókról sem hallottuk.
Egyelőre nem tudni az okát...
Viszont egy újabb kérdéssel fordulnék hozzátok.
Hogy tudom azt megoldani, hogy egy webview-ban localból betöltött html-en belül lévő embedded vido egyrészt automatikusan elinduljon(ha minden igaz ezt már tudom) és szüneteljen, ha annyit scrollozok le, hogy már nem látszódik. Illetve induljon el újra vagy induljon el egy másik video is ha megjelennek.
Köszönöm a válaszokat! -
Karma
félisten
Személy szerint nem erőltetném ezeket a proximity megoldásokat, inkább bevonnék egy Dropboxot vagy Google Drive-ot köztes tárolónak. Androidon a Google fiók elég gyakori, főleg Play Store-os alkalmazás esetén

Nem tudok róla sajnos, hogy a Google adna olyan egyszerű megoldást a szinkronizálásra, mint az iOS-en az iCloud Sync, Windowson meg a roaming settings... De szívesen venném, ha kijavítana valaki.
-
Karma
félisten
"Akkor a custom View osztályban lesz egy mHandler = new Handler(); rész. Ha jól értem, ez rácsatlakozik az UI thread által létrehozott looper-re."
Igen és igen.
Hogyan tudom ezt az egészet megállítani? Kiadok egy mHandler.removeCallbacks() utasítást?
Igen. Ha megnézed a metódus szignatúráját, láthatod, hogy meg kell adni azt a Runnable példányt, aminek az ütemezését vissza akarod vonni.
"1. De mi lesz ebben a runnable? Vagy egy runnable-vel meg tudom csinálni a fenti sort?"
Ha kicsit konkretizáltad volna, hogy mit csinál a View-d és miért kell hozzá két ütem, nem kellene ennyire a levegőbe beszélnünk. Mindenesetre az biztos, hogy a késleltetett kódrészlete(ke)t ki kell raknod tagváltozó(k)ba, mert így tudsz a konkrét Runnable példányokra hivatkozni - melyek egyébként tipikusan lambdák vagy anoním osztályok.
Például (kicsit pszeudokód lesz, mert most nincs előttem IDE):
private Handler mHandler = new Handler();
private Runnable mDelayedStep = new Runnable() {
public void run() {
Log.w(TAG, "BOOM!");
}
};
public boolean onTouch(View v, MotionEvent event) {
mHandler.removeCallbacks(mDelayedStep);
mHandler.postDelayed(mDelayedStep, 5000);
return true;
}És ezzel írtál is egy mini játékot, amiben akkor robban a bomba, ha a felhasználó öt másodpercig nem nyúl a telefonhoz
Amíg simogatja, elodázza a végzetét.Retrolambdával egyébként egy kicsit tömörebb:
private Runnable mDelayedStep = () -> Log.w(TAG, "BOOM!");2. Azonnal megáll a végrehajtás, vagy a következő "tick" még lefut?
Azonnal hat, tehát nem fog lefutni, amit kivettél.
3. Ha leállítom, akkor rögtön indíthatok egy ugyanilyen ütemet, ugyanezekkel a példányokkal?
Persze. Sőt, ha az lenne az igény, egy Runnable-t többször is beütemezhetsz, mert a message queue-ba többször is bekerülhet ugyanaz a példány. Fontos megjegyezni, hogy a removeCallbacks az összes hozzá tartozó üzenetet kiveszi.
-
thon73
tag
Ezekbe a hibákba mindig csak én futok bele!? 
Ezt találtam:
[touch slope]Úgy tűnik, az egyik gépemen elég "nagy", a másikon meg elég "kicsi", ezért a működésbeli különbség. Ettől függetlenül szívesen meghallgatnám, ha másnak van vele tapasztalata.

-
vlevi
nagyúr
Köszi a rész!etes választ. Ezek szerint nincs normális megoldás. Gondolkodtam azon, hogy megpróbálhatnám visszaállítani a környezetet olyanra, mint volt korábban. pl. android 6 helyett csak 5-s sdk telepitek. De szerintem nem érne semmit, mert pl a buold tools-ból is kellene a régi, az meg ugylatom, már nincs. Lehet tényleg 1xűbb összegereblyézni egy új és egy régi gradlet

-
bucsupeti
senior tag
Én linux alatt dolgozom még az 1.0 betaval kezdtem. Azóta folyamatosan frissitek minden normál verzióra. Van 8 nagyobb projektem és aemmi gondom nincs. Problémát olyan okozhat ha pl android api levelt váltasz. Mondjuk egy api 16 os projekthez biztos hozzá kell nyúlni ha át akarsz vele térni 23-ra.
A lényeg hogy neked valószínű a gradle build fájlok hiányoznak. Azokat kellene jól összerakni.
-
thon73
tag
Mivel már volt egy csomó Android Studio maradvány, fogtam az egészet töröltem, és feltettem újból; persze a legújabb JDK alá. Ez pont a fél napot vette igénybe, mire a proxy-tól kezdve mindent beállítgattam.
De továbbra sem bírom rendesen működésre bírni. Egy új project tökéletesen működik, de a régi, amit a github-ról töltöttem vissza, egy csomó régi beállítást (pl. korábbi gardle) keres.
Lehet vajon a projectet frissíteni valahogy?
Vagy ez tényleg úgy működik, hogy mindent abban kell végigvinni, amiben az ember elkezdett dolgozni?? Se JDK, se projekt-környezet nem frissülhet? (legalábbis automatikusan)Nagyon hálás lennék, ha tudna valaki segíteni, reggel óta szórakozok, és semmire nem jutottam, semmi használható doksit nem találtam. Előre is köszönöm, ha valaki megszán. Lehet, hogy én csesztem el valami teljesen triviális dolgot, csak épp nem jövök rá, hogy mi a nyavaja lehetett az.
-
thon73
tag
Hosszas próbálkozás után sem tudtam tökéletesen megoldani.
Ha valaki egyszer ilyesmibe fut bele:A requestLayout() nem fut le azonnal, sőt elég sokáig nem fut le.
Ha az onTouchEvent() rész alatt bárminek szüksége van az új kép adataira (méreteire), az ebben az időben még a korábbi (invalid) értéket fogja tartalmazni.
Az új érték csak az onMeasure() (bizonyos esetekben egyszerűbb lehet az onSizeChanged) lefutása UTÁN érhető el - ami amúgy logikus.
Ezen idő alatt skippelni kell (lehet) az érkező MotionEvent-eket.
DE! a kihagyott eventek miatt nem bizonyos, hogy az UP/POINTER_UP eventeket elkapjuk.Nekem szerencsére nem kellett sem az UP, sem a DOWN részben a méret, és úgy találtam (próbálgatással), hogy valamiért a POINTER_DOWN rész sem következik be onMeasure() lezajlása előtt. (Ezt nem tudom, miért van így; lehet, hogy így sincs.) Viszont: A MOVE eseményekből 40-50 elemet is rendszeresen "skippel" a program.
Így végül eléggé a lassú emberi reakciókra építek, de - végső soron - ez működik.
((Még olvastam egy listenerről, ami a layout lerendezése után értesít, de a logikán ez sem változtat.))
-
thon73
tag

Bocsánat. Megoldódott. Némi további ellenőrzés után kiderült, hogy az editor.clear() rész az Activityben nem működött, egy sima copy-paste után a Fragmentben igen. (Nem tudom, miért. Visszacsináltam, visszaállt.)To Sianis: Nem tudtam, hogy belsőleg hogyan kezeli. De az ellenőrzésekkel az is kiderült, hogy elmenti. Ez gyakorlatilag létrehozza és default értéket ad a preferences-nek. A hiba fennáll, okot nem találtam, a probléma viszont némi átrendezéssel megoldódott. Bár fogalmam sincs miért.
Viszont a rengeteg segítséget köszönöm!
-
WonderCSabo
félisten
-
-
thon73
tag
Megoldottam. Hátha segít valaki másnak is...
Szituáció:
Van egy preference activity/fragment és van egy service, ami olvassa a preferences-t. (A service "védett", semmilyen módon nem lehet hozzáférni a rendszer által támogatott módok közül.)
A gond:
A preference változásait az activity (is) kell, hogy figyelje; részben a feliratok módosítása, részben viszont ellenőrzés miatt (nem biztos, hogy a service fut...)
Ha az ellenőrzés miatt módosul az érték, akkor a változást figyelő onSharedPreferenceChanged() újra meghívásra kerül.
A service is kell figyelje a változást, mert néha reagálnia kellene rá. De az előző esetben a rekació akár kétszer is megtörténhet, is megtörténhet. Ez az adott megoldásban több szempontból is gond, mert pl. nem szabad a nem ellenőrzött értékekkel dolgozni, sok idő stb.
Megoldás:
Pofonegyszerű. Bevezettem egy preference-t "counter" kulccsal. Ha a preference ellenőrzése elegédett, akkor növeli a "counter"-t. Service meg csak ezt a countert figyeli.És a service nem kell kommunikáljon semmilyen megbízhatatlan activity-vel. Csak reagál a változásokra.
Semmi mást nem találtam, ahogy egy InputMethodService-t el lehetne érni Android által adott megoldásokkal. -
Karma
félisten
Nem elfogadták, hanem a kérdező egyszemélyben fogadta el a választ. Nem mindegy, mert egyáltalán nem biztos, hogy helyes is. Amellett, hogy 2010-ben készült, alapvetően elég súlyos hiba egy Contextre(*) static változóval hivatkozni, mert ezzel keresztülhúzod az életciklusát.
(*): Az Application egy kivétel ez alól, mert processzenként csak egy jön létre biztosan.
Ha a Service-ed példányával akarsz közvetlenül kommunikálni, akkor a Binder erre a megoldás, amit egyébként szintén pár sorral le lehet tudni. Még csak nem is agysebészet, kell egy Binder subclass, az onBind metódus a Service oldalon; egy ServiceConnection és a bindService/unbindService hívás az Activity oldalon.
Ha nem közvetlenül akarsz vele beszélni, akkor pedig ott vannak az Intentek és a BroadcastReceiverek - a Service is simán regisztrálhat egyet amikor életben van -; vagy Ottót ill. EventBust is használhatsz. Mondjuk csak ehhez a feladathoz overkill egy külső libet behozni.
vlevi: Egy kicsit összekeverted a dolgokat. Nem ezek a service-ek típusai.
1) Vannak a bound service-ek, amik ahogy írtad, a bindService hatására élednek, és leállnak amikor lecsatlakozott az utolsó kliens.
2) Vannak a started service-ek, amik egy startService(Intent) hatására indulnak; eldönthetik, hogy leállnak-e, futnak tovább, vagy úgy futnak tovább, hogy ha bármi miatt lehalnának, a rendszer akkor is indítsa vissza őket (sticky). Ettől független dolog az, hogy csak az alkalmazásodon belül, vagy kívülről is hívható-e (exported flag).
3) Vannak még hibrid service-ek, amik olyan startedek, amikre bindolni is lehet. Ez a billentyűzet történet szerintem ebbe a kategóriába kellene, hogy essen.
Az IntentService egy speciális started service ősosztály, ami arra szolgál, hogy egyszerűen tudj a háttérben végrehajtandó feladatokat sorban átadni neki, és majd leáll, amikor mindennel végzett. De ettől még nem lesz külön kategória.
-
vlevi
nagyúr
Ez az intent service. Amit mindentől fuggetlenul el lehet inditani, és fut a háttérben, nem kapcsolódiksemmihez. A servixenek saját magának kell leállnia, ha ninxs rá szükség. De tud üzenni más activitynek.
Én pl ezzel oldottam meg azt, hogy az applikqaciobol kilepve elinditok egy servicet, ami backupot készít, ha szukseges, es utana leallitja magat.
A bindservice arra valo, hogy akkor megy, amikor valami hozzakapcsolodik( ez a bind). És leáll automatikusan, ha mindenki lekapcaolodott rola (unbind). Például pont emiatt nem jó az appbol kilepeskori backupra, ugye, mert az app bezaraskor kéne inditani.
A harmadik service a legegyszerubb fajta, ami csak az appon belul fut, nem indithato külön. De appon belöli apróságokhoz meg pont az a jó. -
WonderCSabo
félisten
A szám a végén a support lib revizioja, ami idonkent frissul az SDK managerben. A + egy Ivy függőség verzió jelölő, ergo a felsorolt repozitorikban a 18.0.XXX verziójú artifactok közül mindig a legújabbat szedi le.
De ez egy rossz hozzáállás, már Androidék is rájöttek. Használj fix verziót, így nem érhet meglepetés, ha frissül a support lib. Az Android Studio warninggal úgyis jelzi, ha nem a legújabb verziót használod. Az aktuális a 23.0.1, ezt írd be.Nem használtál még függőségkezelést?
-
Sianis
addikt
Javítsatok ki, ha tévedek, de én úgy tudom, hogy azért is érdemes a support libes dolgokkal operálni, mert abban olyan Fragment implementáció van, ami folyamatosan frissül. Ugye 4.0 környékén még voltak bajok rendesen.
Illetve a lentebb, fentebb, kinek hogyan esik hívással konkrétan az a baj, hogyha nem a support verziót hívod meg akkor a rendszer hajlamos elfelejteni úgy egyáltalán hívni a loadert.
Nálam most az a trendi, hogy alap az AppComat és mindenből support. Látszólag ez adja a leginkább konzisztens érdemenyt.
Feltétlenül javítsatok ki, ha tévedek. Annyit változtak a dolgok rövid idő alatt, hogy ember a talpán aki követni tudta!
-
Sianis
addikt
UsageStatsManager esetleg?
-
Karma
félisten
Az enumok memóriaigényéről nem tudok semmit (eredetileg az óva intésről se tudtam, én vígan használtam ha azt ítéltem a megfelelő eszköznek
).A képekkel valószínűleg szerencséd volt, vagy nem foglalnak annyit, mint gondoltad. Még mai eszközökön is jókora OOM pofonokat lehet kapni, ha mondjuk fényképeket olvas fel az ember sampling nélkül, és nem hív rájuk recycle-t.
A 16 MB-os korlát már nagyon régen volt egyébként, platformonként és eszközönként is ingadozik. Némi olvasnivalót találtam a témában SO-n: [link][link] Az utóbbiban van egy lista pár modern eszközről is, hogy hogyan alakultak a számok.
-
Karma
félisten
Mondjuk a Java enumoknak nem sok közük van a C-s formához, ahol nem volt több egy nevesített int konstansnál. Itt azért azáltal, hogy ezek singleton Java objektumok, amiknek saját metódusaik is lehetnek, sokkal vagányabb dolgokat össze lehet hozni. Például a Command GoF mintát elég triviális így megírni.
Hah, jó sokáig ültem a hozzászóláson.

-
Szmeby
tag
Nem sok az a 10-20 másodperc? Biztos nem lehet rajta gyorsítani? Ez borzasztóan soknak tűnik. Egy pc ennyi idő alatt megszámlálhatatlanul sok objektumot tud gyártani. Még néhány full gc is megfuthat közben.
Gondolom az io viszi el az idő nagy részét, de kizártnak tartom, hogy az android ne tudná ezt a fájlt már induláskor cache-elni. Hiszen előszeretettel használ ui leíró config xml-t. A legkevesebb, hogy ezt gyorsan tudja is használni.Ha először váltok egy másik billentyűzetre, nekem azonnal megjelenik a cucc, szóval valahogy tuti meg lehet ezt oldani. Opensource, (elvileg) saját billentyűzetet is tartalmazó app: Keepass2Android. Talán segít.
Az android dev tutorial egy mondattal elintézi a dolgot: preload, de semmi részletezés, hogy hogyan kellene. Egy pörgő animáció a billentyűzet helyén nem tűnik valami szép megoldásnak.
Olyan lifecycle eseményhez nem tudod kötni az objektumok legyártását, vagy legalább a fájl felolvasását, ami nem a billentyűzet kiválasztása esemény? Hanem valami korábbi időpont. Mondjuk a telefon elindulása.

Ezt találtam, nem egy komplex billentyűzet, de én nem látom, hogy az InputMethodService referencia bárkinek is átadásra kerülne. Viszont a getCurrentInputConnection() meg a BroadcastReceiveres megoldás érdekesnek tűnik azzal a queueval. Bármit is csinál...
-
Szmeby
tag
"Bár ezzel a válasszal nem sokra mentem."
Szóval van állapota? Van unit teszt?De mindegy is, inkább írok.
A singleton önmagában nem ördögtől való. Probléma akkor lehet, ha van állapota, és azt a tőle függő komponensek változtathatják. Ugyanis ha a sigletonban van field, és az nem csak olvasható, akkor nem tudod előre megjósolni, hogy a singletonod éppen milyen állapotban van, mivel azt a komponensek kedvük szerint állítgatják. Sztochasztikussá válik a viselkedése. Ugyanez igaz a random vagy az idő használatára is. A random viselkedés pedig rejtett bugokat szül.
Info: shared global stateTegyük fel, téged ez a veszély nem fenyeget, mert nincs benne field, vagy az csak olvasható. Ilyenkor még mindig probléma lehet, ha a singletont használó osztályaidat (unit) tesztelni akarod. Pl.:
public class MyClass {
//...
public String doingSomethingCool(String id) {
Entity e = MyDatabaseAccessorSingleton.getInstance().findById(id);
// ...
return coolStuff;
}
}Hogyan teszteled a metódust, ha nem szeretnél mellette egy működő adatbázist is futtatni. Sajnos sehogy.
Lehetséges megoldás:
public class MyClass {
private final MyDatabaseAccessorSingleton db;
public MyClass(MyDatabaseAccessorSingleton db) {
this.db = db;
}
//...
public String doingSomethingCool(String id) {
Entity e = db.findById(id);
// ...
return coolStuff;
}
}A teszt immáron helyettesítheti az adatbázisos objektumot egy teszt double (mock) példánnyal. Ez esetben viszont már megkérdőjelezhetővé válik, hogy valóban szükséges-e singletonként definiálni azt. De ez már messzire mutat.
Leszámítva a fenti két problémát a singleton egy tök jó pattern, és bátran alkalmazhatod, ha szükségét látod. Csak ésszel kell csinálni.
Ez talán válasz arra a kérdésedre, hogy a contextet miért nem oldották meg így. A contextnek szerintem van változó állapota. Ebből singletont csinálni egyenlő a káosszal.
-----
Áttérve a konkrét problémára. Sajnos tényleg nem ismerem az android architektúráját, és lehet, hogy a singletonnal jársz jobban. Ezt megerősíteni és cáfolni sem tudom. Majd a tapasztalt androidosok biztos leírják a véleményüket.
Remélem, nem értelmezem félre a dolgot, de nekem az jött le, hogy az InputMethodService megsérti az SRP principlet, mert nemcsak az a dolga, hogy felépítsen egy billentyűzetet (KeyboardView - GeneralKeyboardData - Keyboard - Button - Text), hanem ki is kell szolgálnia a billentyűzetre tapicskoló eventeket. Ezt talán célszerű lenne két külön osztályban megvalósítani. Talán te is pont ezt írtad.
Legalábbis ha jól értem, hogy az "adatstruktúra" alatt a billenyűzetet érted, rajta a gombokkal, textekkel.Véleményem szerint az elnevezések alapján az event fogadása nem feltétlenül a text feladata, hanem a buttoné. Legalábbis ha én olvasok egy kódot, akkor arra számítok, hogy a text csak a gombon lévő szöveg tartalmáért felel, annak stílusáért, stb. Az esemény pedig a gombon keletkezik. De ez akár elnevezési probléma is lehet. Én mindenesetre a gombra fogok hivatkozni, a textet nagyon nem ideillőnek érzem.
Szóval a gombok event listenere pedig továbbpasszolja az eseményt egy event handlernek (talán az InputMethodServicenek?), ami elvégzi a gombnyomás mögé rejtett logikát. A gombnak tehát szüksége van ebből egy példányra, hiszen mit ér a gomb, ha nem csinálhat semmit.
Nincs sok lehetőség:
1. Leküldöd a billentyűzet legyártásakor minden gombnak ezt a referenciát.
2. Vagy csak a GeneralKeyBoardDatáig. Bár akkor a GeneralKeyBoardData példányt kell majd továbbpasszolnod a gombok felé, hogy azok lekérdezhessék. Tehát ígyis-úgyis utazik lefelé egy referencia, így ha ez a megoldás nem hoz látható javulást, akkor nem éri meg, csak ront az átláthatóságon.
3. Használod a gombban a singletont.
4. Használsz valamilyen android hókuszpókuszt. Az előző hozzászólásomban a contextre gondoltam, legalábbis a neve alapján arra asszociáltam, hogy ezen keresztül elérhetők ill. elérhetővé tehetők a szükséges komponensek. A válaszodból az jött le, hogy nem."Vagy valahogy kiszedem az InputMethodService hivatkozását magából az InputMethodService-ből"
Ezt nem értem, itt a singleton.getInstance()-ra gondoltál, ugye?Nekem ez az egész egyébként UI-szagúnak tűnik, és backend fejlesztőként én úgy gondolom a UI-t nem is igazán kell tesztelni. Legalábbis nem így. Állapota meg biztos nincs, ugye? Szóval menjen az a singleton!

Sajnálom, hogy nem tudtam érdemben segíteni, csak a java oldalt ismerem.
Senki sem fog programozási paradigmákról flame wart indítani, annyi féle létezik, imperatív, deklaratív, oo, stb, egyesek valamennyire átfedésben vannak másokkal, mindegyiknek van előnye és hátránya, ostobaság lenne erről vitatkozni. A programozás úgyis arról szól, hogy kiválaszd a neked/projektnek megfelelőt, és megtanulj együtt élni a hátrányaival.
Vagy készítesz egy új programnyelvet, új megoldásokkal, és majd csak utána jössz rá, hogy a többinél nem jobbat alkottál, csak másabbat.
Szóval a "komoly" emberek vitassák bátran az oo-t, ha nincs jobb dolguk. Én is fel tudok hozni egy csomó hátrányt az OOP-ben, de ugyanúgy a funkcionális nyelvekben is, stb. De miért tenném? A világ nem lesz jobb, ha elkezdek fikázni egy paradigmát, vagy egy nyelvet.
Amit viszont én írtam (static hívások, globális állapottal, javaban) az egy erősen kisarkított példa volt, természetesen ironizáltam. Bele kell törődni, hogy a java egy oo nyelv, és a szabályokat ugyan meg lehet szegni, csak hosszútávon legtöbbször nem éri meg.A "lineáris programozás" alatt mit értesz?
-
Szmeby
tag
A Servicenek van állapota?
Amúgy próbáld meg unit tesztelni a singletonra hivatkozó osztályaidat, és rájössz, miért nem jó.
Persze a célnak megfelel, csupa static hivatkozással is lehet programot építeni, a sok hülye meg erőlteti itt az objektumokat, mi?
Én nem érteni Android, de minek van a context, ha abból sem nyerhető ki a kívánt service?
-
thon73
tag
Egy fél napos keresgélés után a következőt találtam:
A build.gradle file-ban a classpath 'com.android.tools.build:gradle:1.0.0' bejegyzésben helytelen a verziószám, és magától nem javítja. Kézzel kell kicserélni 1.1.0-re.
Láss csodát, azóta működik!
Gondoltam, megosztom, hátha valakinek még hasznára lesz. Úgy tűnik, ez a hiba nem túl gyakran jelentkezik. -
thon73
tag
Bocs, még mindig a WACOM által okozott ACTION_CANCEL-nél vagyok leragadva.
Sehol nem találok info-t arról, hogy miként működik az ACTION_CANCEL multitouch esetén. Ugyanis ilyenkor (vagyis, ha az SPen közelít) egyetlen eventben van összefoglalva az összes touch ACTION_CANCEL megjelelöléssel. Más módon pedig nem tudtam ACTION_CANCEL-t előidézni.
Kérdésem:
AZ ACTION_CANCEL esetén minden multitouch érintés megszakad, avagy lehet olyan szituáció, hogy csak egyetlen érintés szakad meg, míg a többi továbbmegy? (Vagyis ACTION_CANCEL esetén ki kell-e értékelnem az összes event-ben lévő érintést, vagy simán eldobhatom az összeset? Köszönöm! -
Vagy asset vagy adsz sd-re irasi jogot az appnak (de lehet ez mindket esetben kell) es siman letrehozol egy filet egy konyvtarban majd beleirsz, vegen meg lezarod. Asszem FileWriter a neve vagy micsoda.
szerk: itt egy pelda kod
public void generateNoteOnSD(String sFileName, String sBody){
try
{
File root = new File(Environment.getExternalStorageDirectory(), "Notes");
if (!root.exists()) {
root.mkdirs();
}
File gpxfile = new File(root, sFileName);
FileWriter writer = new FileWriter(gpxfile);
writer.append(sBody);
writer.flush();
writer.close();
Toast.makeText(this, "Saved", Toast.LENGTH_SHORT).show();
}
catch(IOException e)
{
e.printStackTrace();
importError = e.getMessage();
iError();
}
} -
lanszelot
addikt
Lehet , hogy azért nem fordítja jól át, mert nem windows-om van. Nem tudom.
Mindent megcsináltam amit írtál, de csak fekete képernyő a vége.Már ajánlották régebben, de nekem az nem volt jó amire kellett.
Mivel a progi már kész, csak tanulás végett folytatom.
Ami a programban volt, abból egyedül a gombot nem tudom megcsinálni, a többi már megy, így gondoltam még egy lépést
-
lanszelot
addikt
Igen, így már semmi baja. Oda akartam bigyeszteni, csak amikor felajánlotta a dolgokat kiment a fejemből.
Még egy szöveges részt kell majd beillesztenem, de az csak kiírás, azzal nem lesz gondom
Szeretném Nagyon, Nagyon Szépen megköszönni mindenkinek a segítséget!

Még biztos lesznek kérdéseim, de az indulás mindig a legnehezebb.
-
lanszelot
addikt
Most ezzel a két sorral van baja:
android:id="@+id/saveButton"
és a
android:text="save" />
alsónál a "save" ra ha ráviszem az egeret ezt írja ki:
[I18N] Hardcoded string "save", should use @string resource less... (⌘F1)
Hardcoding text attributes directly in layout files is bad for several reasons: * When creating configuration variations (for example for landscape or portrait)you have to repeat the actual text (and keep it up to date when making changes) * The application cannot be translated to other languages by just adding new translations for existing string resources. In Android Studio and Eclipse there are quickfixes to automatically extract this hardcoded string into a resource lookup. -
lanszelot
addikt
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity"><ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/saveButton"><LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android
rientation="vertical"><EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint_name"
android:inputType="textPersonName"
android:maxLength="99"
android:singleLine="true" /><Button
android:id="@+id/saveButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="@string/save" />
</LinearLayout></ScrollView>
</RelativeLayout>
-
lanszelot
addikt
Hello!
1: igen android studio-t
2: igen azt alakítottam átNem tudom android studioban futtatni a programot, mert nincs windows-om, és a rendszerem alatt nem működik a virtuális futtató rendszer.
Így csakis telefonon tudom tesztelni.Rootoltam a telót amin futtatom, tehát bármihez hozzá férek, de a "logcat"-ot nem találom, hol keressem?
A Sianis programja jól működik. az enyém is működött, amíg kb 10 adatot kért be /mentettem folyamatosan, hogy vissza nézhessem/, de most már majdnam 40-et kér be. Nézegettem a hibát, de nagyon nem találom. Semmi féle hibát nem jelez /ami nem azt jelenti nincs/ A két mentés között már csak az adatbázist szerkesztettem, tehát szerintem ott lesz valami.
A db fileba csak a nevek vannak, semmilyen bevitt adatot nem rak bele. Elmenti, de adatok nélkül.
Néztem telón, és laptopon is, mind kettő azt mutatja.Az a fura, hogy úgy csinál, mintha teljesen jól működne, nem lép ki, nincs hiba üzenet, látszólagosan elmenti, mert mentés gombra nyomva kiüríti, hogy ismét be lehessen vinni a következő adatokat. Az eredeit is így működik, csak ott a db file-ban ott vannak az adatok.
A program nem olvas vissza adatot. Egyszerűen a bevitt adatot berakja egy db file-ba.
-
lanszelot
addikt
Kicseréltem string-re, így most már jól működik, de
Rootlotam a régi telomat, és feldobtam rá az sqllite editort, így már meg tudom nézni végre az adat file-t.
Csak egy gond van, hogy üres.
Beírom az adatokat, majd rányomok a mentés gombra, és semmi hibát nem jelez, mintha tökéletesen működne, de csak egy üres db file-t ment el, ahol ott vannak a nevek, csak nincs semmilyen bevitt adat.
Nézegettem, de nem látom hol hibáztam
-
lanszelot
addikt
Root nélkül nem is lehet megcsinálni?
Nem root-olom a telefonom, és nincs pc-m.
Valami megoldásnak csak lennie kell...thon73 : olvass vissza miket kaptam segítség helyett, csak azért mert nem tudok programozni.
A linket amit küldtél nem értem, mert tele van szak szóval, amiből egyet se ismerek.
Az adb-t se tudom mi az. Bocsi. -
lanszelot
addikt
Kérlek, kérlek! Szépen kérlek titeket, ne ezen lovagoljatok már!
Az alkalmazás 100% elkészítettem. Fogalmam sincs a programozásról, és én csak a megírt tanítót olvastam / Sianis írta nekem/, értelmeztem, és átalakítottam. Nem akarok erről beszélni. Ti lelőttetek azért mert az ODK alkalmazásról kérdeztem, mert off. De az, hogy ti folyamatosan rugdostok, az nem off?Annyi a gondom, hogy nem tudom hová menti a db file-t.
Akárhogy keresem, nem találom.
Valahová menti, mert mentés után a beállítások-alkalmazások-saját alkalmazás -ban megjelenik egy 44kb-os file az adatok-nál. Tehát vhol van. De hol? -
WonderCSabo
félisten
Én egy gépen dolgozom alapvetően, de rengeteg megosztott projekten, ezek általában git repóban vannak. Manapság egyre jobban törekszenek a projektek hordozhatóságára is, pl. egy gradles projekthez alig kell valami, hogy leforduljon repóból checkoutolva (jdk meg android sdk). Én úgy látom, hogy a világ ebbe az irányba megy el.
Egyébként a sok brancheléshez ajánlom ezt a modellt, nagyon sokan használják, jól működik.
-
thon73
tag
Bocs, tudom: google a barátom

Megvan a hiba meg a megoldás is: How to fix font anti-aliasing in IntelliJ IDEA when using high DPI?
Aj, pedig úgy tűnt, hogy ezt most télleg minden gond nélkül feltette. De aztán mégse.
-
WonderCSabo
félisten
Azért annyira nem bonyolult az Ora JDK telepítése.

Új hozzászólás Aktív témák
- Hardcore café
- Sorozatok
- Fujifilm X
- Macska topik
- Visszatérnek a Samsung tervezte CPU-magok és GPU az Exynos 2800-ban?
- Rugalmas OLED panelre válthat a Samsung Galaxy A57
- czundermák: Shikoku Henro #0: Mégis mi ez?
- One otthoni szolgáltatások (TV, internet, telefon)
- Milyen okostelefont vegyek?
- Samsung Galaxy A54 - türelemjáték
- További aktív témák...
- Szép! Lenovo Thinkpad T14s G2 Üzleti "Golyóálló" Laptop 14" -50% i5-1135G7 4Mag 16GB/512GB FHD IPS
- Bomba ár! Lenovo ThinkPad Yoga 370 - i5-G7 I 8GB I 256SSD I 13,3" FHD Touch I W11 I Cam I Gari!
- Bomba ár! Lenovo ThinkPad Yoga 260 - i5-G6 I 8GB I 256SSD I 12,5" Touch I W11 I Cam I Gari!
- HP EliteBook 850 G8 Fémházas Tartós Laptop 15,6" -65% i7-1165G7 16/512 Iris Xe FHD
- Bomba ár! Lenovo ThinkPad X390: i5-G8 I 16GB I 256-1TSSD I 13,3" FHD Touch I HDMI I Cam I W11 I Gar
- BESZÁMÍTÁS! Apple iPhone 12 Mini 64GB mobiltelefon garanciával hibátlan működéssel
- ÚJ Lenovo ThinkPad T16 Gen 4 - 16" WUXGA - Ultra 7 255U - 32GB - 1TB SSD - Win11 - 3 év garancia
- TELJES KÖRŰ IT BESZERZÉS
- HIBÁTLAN iPhone 13 128GB Red -1 ÉV GARANCIA - Kártyafüggetlen, MS3760
- Eladó egy HP omen 17-w131ng laptop 1,5 TB ssd vel Dobozában
Állásajánlatok
Cég: Laptopszaki Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest






Amíg simogatja, elodázza a végzetét.
Ezekbe a hibákba mindig csak én futok bele!?


rientation="vertical">




