- iPhone topik
- Yettel topik
- Samsung Galaxy S25 Ultra - titán keret, acélos teljesítmény
- Samsung Galaxy Watch7 - kötelező kör
- Motorola Edge 60 és Edge 60 Pro - és a vas?
- Hivatalosan is bemutatta a Google a Pixel 6a-t
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
- Friss koncepciót hoz a Nothing Phone (3)
- Xiaomi 15 Ultra - kamera, telefon
- Íme az új Android Auto!
Új hozzászólás Aktív témák
-
thon73
tag
Ez a kérdés alapvetően nem ebbe a topicba tartozik. Egyébként nekem nem sikerült megoldanom, bármilyen system beállítással legalább lekapcsol egy idő után, aztán azonnal visszakapcsol. (Könyvet olvas fel bluetoothos fülhallgatón, így elég sokáig tudom tesztelni, és az olvasóprogram meg sem szakad amúgy.)
Ami ide tartozik: ha nem érdekel a teljesítmény (vagyis az akku), akkor tudok vajon olyan programot készíteni,
- ami ébrentartja a készüléket,
- lehetőleg root nélkül,
- lehetőleg kikapcsolt képernyővel?Félelmeim szerint az ANR miatt nem fog menni, akárhogy dolgoztatom a fő szálat. Avagy?
-
thon73
tag
CursorLoader alkalmazásánál (egy régebbi projekt bővítésénél) az
onLoadFinished()
által visszaadottCursor
closed.
Találkoztatok már ezzel?
Ezt a stackoverflow bejegyzést találtam.
Mit lehet ezzel tenni? (Lehetőleg a Loader újraindításán kívül) -
thon73
tag
válasz
bandi0000 #4846 üzenetére
Talán annyi érdekesség van benne, hogy azért kezdtem el, mert nem találtam programozót, aki megvalósítsa az ötleteimet. Később másnak is fejlesztettem, olyasmit, ami engem is érdekelt. Ma megint ott tartok, ahol az elején: ha lenne valaki, aki megcsinálja helyettem, nem bánnám.
-
thon73
tag
válasz
bandi0000 #4844 üzenetére
Igen, ez eredetileg egyfajta front-end-nek készült. A táblák, a listView-k és az egyes rekordokat megadó űrlapok is néhány sorból elkészíthetőek, mert a háttér már kész. Ugyanakkor minden a programban készül, és ez elég nagy flexibilitást adott ahhoz, hogy a legkülönbözőbb projektekben használjam. Az export-import szöveges, és ez - többek között - azért jó, mert könnyen lekezelhetőek az adatbázisváltozással járó problémák.
Neked sztem nem az adatbázis résszel, hanem a file-résszel van problémád. A helyedben meghívnék egy file-kezelőt egy folder-ért, aztán amit visszaad azt kiegészíteném egy file-névvel, és kész. Ha nincs megfelelő file-kezelőd, akkor érdemes az Open Intent filekezelőt használni.
Egyébként a fenti projektben egy komplett file-kezelő rész is van, az praktikusan külön kiemelhető, ha szükségét érzed, és az igényeidnek megfelelően módosítható. De elég univerzális amúgy. -
thon73
tag
válasz
bandi0000 #4842 üzenetére
A "destination" is file kell legyen, nem pedig folder.
A logikával szemben (vagyis másold ezt a file-t a megadott folder-be), a parancs úgy szól, másold a forrás file tartalmát a cél file tartalmáNAK. Vagyis hozz létre egy üres file-t a directoryban, és abba már bele fogja tenni.
Hirtelen kereséssel egy példa: https://stackoverflow.com/a/30948757Más:
az adatbázis kimásolása egy aránylag egyszerű dolog, de az exportálása egyáltalán nem triviális. Egy korábbi projekt során küzdöttem ezzel; ráadásul most épp leporoltam ezt a projektet. Ha érdekel, itt: https://github.com/Palmodroid/Mecsek megtalálod. Hozzáteszem, ez egyáltalán nincs kész, de az export-import rész működik. -
thon73
tag
Használ vki layout stb. mappán belül subfoldereket?
Ezt találtam: https://stackoverflow.com/questions/4930398/can-the-android-layout-folder-contain-subfolders
De ellentmondóak a hozzászólások.
Tudom, "próbáld ki", de gondoltam egyszerűbb, ha dob vki. egy "igen"-t, vagy egy "próbáltam, nem ment"-et. Ráadásul azóta a verziók is növekedtek, ami más esetekben már okozott némi gondot.
Köszi! -
thon73
tag
válasz
[KgP].Robot #4828 üzenetére
Hű, ez fontos. Ez biztos, hogy így van? Akkor bizonyos gépeken nem futnak el a több ujjas programok? Játékok sem? Az OS kikapcsolást sem lehet vhogy a programból megoldani? Nekem az lenne logikus, hogy azt kapja meg a rendszer, amit a program nem dolgoz fel - ezek szerint nem így van.
-
thon73
tag
Hát, igazság szerint még sehogy. Azért kértem a tanácsot, hogy melyik úton célszerű elindulni. Az alapötlet a Loader lett volna, minden aktív fragmentben egy külön loaderrel, amit a fragment lebontásakor szintén eldob. (Hozzáteszem ez egy korábban félbemaradt projekt, ahol az adatbázis egyes elemeit egy naptár oldalról is el tudom érni. Az adatbázis rész kész, a listek még Loaderrel készültek.)
Több ponton elakadtam. A Loaderrel igazából ezt elég könnyen meg lehetne oldani - tudom, hogy már nem ildomos. A Room és LiveData együttessel apró probléma, hogy szerintem az egész korábbi programot át kéne írni, amire leginkább nincs időm.
Mielőtt rájöttem volna, hogy miként rakjam egybe a régi és új kódot egy újabb problémába futottam bele: A ViewPager (konkrétan Fragment, de ez mindegy) - elég komoly, 2-3 másodperces késéssel indul már 3 ablaknál is. Ez azért érdekes, mert lényegileg az egész egy custom Layout, ami gyakorlatilag semmilyen számolást nem használ, sőt, még azt is minden egyes alképernyőn újra felhasználja. Lapozásnál semmilyen várakozás nincs, pillanatok alatt lapoz 8-10 lapot, nemhogy hármat. Ráadásul a log szerint a fragmentek is pikk-pakk felépülnek; nem tudom, mire kell ez a rengeteg idő.
Jelenleg azt hiszem, a kiolvasás optimalizálása lesz a legkisebb problémám. Először ezzel a megjelenítéssel kell kezdenem valamit. Egyébként nem is értem. Miért nem jeleníti meg az első fragmentet, aztán amig az ember gyönyörködik benne, építhetni a többit.
-
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? -
thon73
tag
Igen, majdnem pontosan így. Köszi, ezen el tudok indulni. Leginkább az okoz nehézséget, hogy több lehetőség közül kiválasszam a legegyszerűbben elkészíthetőt.
A megjelenítést egy ViewPager végzi, csak nem egészen listában, hanem egy custom-view-ben. Konkréten ez egy ugyanolyan naptároldal, mint az összes többi.
Azért kérem el a hónap összes adatát, mert ezen az oldalon mindegyik szerepelni fog.
Jobb és bal slide-dal ugrok a szomszédos hónapokra - elvileg végtelen lehet, de 3 évvel - 36 hónap - mindenképp számolni kell. Pontosan ezért nem szerettem volna minden ablaknak külön háttérszálat nyitni.
A háttérben egy elég összetett adatbázis áll, de a "naptár" rész elég egyszerű. Mindenki ugyanabba a táblába jegyezhet be dátummal és rövid szöveggel, nekem most csak ezt a táblát kell lekérdeznem.
Kis érdekesség, hogy a naptár-rekordok feljegyzik, hogy honnan származnak, és vissza tudnak vinni a kiindulási rekordra több táblában is. -
thon73
tag
Sqlite-ban jártasaktól kérdezem:
Az adatbázis megfelelő sorait egy View-ban jelenítem meg. Ezeket a sorokat háttérszálon töltöm le. Ez OK.
DE!
Mit kell tenni olyankor, ha több View-ban jelenítem meg ugyanannak az adatbázisnak különböző adatait? Konkrétan egy naptár minden egyes hónaphoz alkot egy View-t (Fragmentet), melyekből egyszerre egy látszik, de - elméletileg - közel végtelen van. Minden egyes View ugyanazon adatbázis egy részét (az adott hónaphoz tartozó adatbázisrekordokat) jeleníti meg.Hogyan érdemes ilyenkor az adatbázis lekérdezését megszervezni? Minden egyes fragment nyit egy külön háttérszálat? Vagy egyetlen háttérszál mindig másik hónapot kérdez le? Vagy mi itt a jó megoldás?
Előre is köszönöm! -
thon73
tag
válasz
[KgP].Robot #4820 üzenetére
Ha küldesz kódot, megpróbálok segíteni. Van programom, ami most is multitouch-ot használ. Ez egy korábbi próba, ami jól működött; point rész értelemszerűen cserélendő.
switch (event.getActionMasked())
{
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
int historySize = event.getHistorySize();
int pointerCount = event.getPointerCount();
Log.i("MULTI", "Poi: " + pointerCount + " His: " + historySize);
for (int p = 0; p < pointerCount; p++)
{
for (int h = 0; h < historySize; h++)
{
Point point = new Point();
point.x = event.getHistoricalX( p, h );
point.y = event.getHistoricalY( p, h );
point.press = event.getHistoricalPressure( p, h );
point.type = 0;
points.add( point );
}
Point point = new Point();
point.x = event.getX( p );
point.y = event.getY( p );
point.press = event.getPressure( p );
point.type = 1;
points.add( point );
}
this.invalidate();
break;
} -
thon73
tag
Bocsánat, ha nagyon alap kérdést teszek fel. Egy
View
számára készítek időzítést. Egy összefoglaló képen az ikonok másodpercenként váltják egymást.A
new Handler()
ugye az UI Thread-en indul, ugye? (ha a View-ból indítom) Gondolom, ezt nincs is értelme háttérszálra tenni.
Indításra és leállításra használhatom-e azonAttachedToWindow()
ésonDetachedFromWindow()
metódusokat?Itt a kód is:
public class DiaryLayout extends ViewGroup
{
private int columns = 7;
private int rows = 5;
private Handler repeatHandler = new Handler();
/*...*/
@Override
protected void onAttachedToWindow()
{
super.onAttachedToWindow();
repeatHandler.postDelayed( repeatRunnable, 1000 );
}
@Override
protected void onDetachedFromWindow()
{
super.onDetachedFromWindow();
repeatHandler.removeCallbacks( repeatRunnable );
}
private Runnable repeatRunnable = new Runnable()
{
@Override
public void run()
{
for ( int row = 0; row < rows; row++ )
{
for (int col = 0; col < columns; col++)
{
getChildAt(row * columns + col).invalidate();
}
}
repeatHandler.postDelayed( repeatRunnable, 1000);
}
};
} -
thon73
tag
Újabb probléma, ezúttal viszont a gépben van a hiba.
A képernyő 480 fizikai pixel széles (emulátor).
Létrehozok rajta egy ViewGroup-ot, ami "480 px" széles. Ennek egyetlen child-ja lesz, ami egy négyszöget rajzol.A probléma:
A nyégyszög csak akkor kerül a képernyő legszélső pixeljére (elvileg 0. és a 479. pixel), ha:
A ViewGroup onLayout-ban a Child left: 0, a Child right 480 (!!)
A Child-ban a négyszög rajzolásához RectF left 1.0, a RectF right 480.0. (Vastagság természetesen 1 pixel)Bármi mást állítok be, vagy lesz egy üres rész a kép széle és négyszög között, vagy eltűnik a négyszög oldalvonala.
Gondolom, valahol van valami kerekítési hiba. De hogyan lehet akkor ezekkel az értékekkel számolni, hogy pontos méreteket kapjak? Vagy hogyan tudom pont a View szélére tenni a négyszögemet? Van ezzel vkinek tapasztalata? -
thon73
tag
-
thon73
tag
Létezik olyan helyzet, hogy a Fragment újrainduláskor megtartja a saját változóit? Vagyis az onActivityCreated() metódusba úgy jut el, hogy a Fragment osztály változói a korábbi futásban kapott értékeiket tartalmazzák?
-
thon73
tag
Szerintem örülj, hogy egyáltalán találtál vkit., aki megcsinálja. Én elpötyögök egy kicsit androidban, úgyhogy pontosan tudtam, mire van szükség, pénz is volt (és nem kellett alkudni), mégis Prágában találtam az első csapatot, akik érdemben szóba álltak velem. Szóval, az is nagy kérdés, kinek van egy projektre szabad kapacitása. Igaz, ez néhány éve volt, azóta én is inkább "összedobom" magamnak, ha az időbe belefér.
Amúgy ez egy érdekes kérdés, hogy van-e egyáltalán vki, akinek a profiljába elfér a felbukkanó ötletelők ötleteit legyártani. -
thon73
tag
válasz
balazs1022 #4647 üzenetére
A programozás az, amikor megírod (vagy akár átírod) egy program forráskódját, és azt lefordítod. (Persze, a rom is így készül először.) Ez a topik erről szól
A rom "főzés" nagyrészt kész programoknak az összerendezése. Összepakolod a neked tetsző részeket, és készítesz belőle egy új romot, amit a készülék szépen kicsomagol magának. Lehet persze, hogy új programot (vagy részt) is csomagolsz bele, de akkor csak annak az elkészítése tartozik ide, mármint a programozásba.
Ha főzöl egy romot, az azért jó, mert bárki más is fel tudja rakni a készülékére. (Szerintem az android annyit változott időközben, hogy erre egyre kevésbé van szükség. De ez csak a magánvéleményem, ettől még létezik.)
Namármost. Ha nem akarod, hogy mindenki más is felrakja a módosításodat, akkor a saját telódon root mode-ban (és ez ált. amúgy is szükséges új rom felrakásához), bármit le tudsz törölni, vagy fel tudsz rakni. Szóval nem kell új romot csomagolni, csak a megfelelő "részt" kicserélni, esetleg csak átírni.
A kulcsszó a megfelelő.
Ezzel ugyanis prímán téglásíthatod a telódat (ha már szakszavak...), elég egy rossz mozdulat. No, és ezért nem fogja sztem. ezt megcsinálni neked senki. Mert az egy dolog, hogy a saját telómat beáldozom, miközben játszok az átalakításával. Vagy ha nagyon jól megy, akkor az elkészített, tesztelt cuccot felteszem a netre. De egy konkrét telón megtalálni azt az egy módosítást... Na, ezt esetleg a rom készítője tudja.Ha a fent leírtak újak, akkor semmiképp ne nyúlj a telefon érzékeny részeihez!!! Egyébként nem baj, ha nem tiszták, ezt is meg lehet tanulni, csak akkor még nem tartasz ott.
A többiektől ezer bocs, de egyszer ezt is le kellett talán írni.
-
thon73
tag
Sziasztok!
Ha készítek egy Content Provider-t, akkor különböző hívások a Content Resolver-en keresztül érkeznek.
Az Android Studio-ban van arra valami egyszerű megoldás, hogy ezeket a hivatkozásokat kikeressem? Ugyanis a Content Provider metódusoknál - értelemszerűen - nem működik a find usage funkció, mert ugye Resolver metódusait kéne megkeresni. De hogyan? Kézzel? Szöveges keresésként? Köszönöm! -
thon73
tag
Ha esetleg olvastatok valahol egy egyszerű összefoglalót vagy útmutatót a compat részek használatáról, legyen kedvesek megosztani a linket!
Igazából a legnagyobb gondom akkor van, amikor egy régebbi projektet, vagy egy részét szeretném felfrissíteni. Melyik osztályt kellene kicserélni (extend után), ill. melyik metódusaikat? Vagy mi az ami maradhat? A hivatalos doksiban ilyen irányú útmutatást nem találok.
Előre is köszönöm! -
thon73
tag
válasz
balazs1022 #4619 üzenetére
A billentyűzetek megkapják a "hardveres" gombokat is, és azt is le tudják kezelni. Lehet, hogy egyszerűbb egy ilyen billentyűzetet keresni (vagy írni), ami tudja ezt a funkciót. A hardveres billentyűzetekhez vannak ilyen "átalakító" soft-keyboardok, bár kétlem, hogy ezt a funkciót ismernék.
Igaz, ez third-party program, viszont legalább programozás megírni. -
thon73
tag
Köszönöm!
A gond csak az, hogy még mindig nem értem a használatát. Ezt vajon a View állítja be, ha nagyobb akar lenni, mint a Parent által adott érték? És akkor a Parent mit tesz? Tudomásul veszi, vagy küld nagyobb értéket? (Gondolom, ez nincs felprogramozva, csak a logikát kérdem.)A konkrét probléma lényege:
A parent egy frame-layout, amit a rendszer ad a KeyboardLayout számára, nem tudom megváltoztatni.
A Custom View magassága (alapvetően a rendelkezésre álló szélességtől függ), de ami fontos: nem haladhatja meg a rendelkezésre álló magasság egy bizonyos százalékát. Ez idáig egyszerűnek tűnik.
DE!
A mérési ciklus során egy csomó onMeasure() hívást kapok, melyek némelyike a teljes magasságot, némelyike a Navigation Bar-ral csökkentett magasságot, némelyike a már számított magasságot, némelyike pedig az általam számítottnál is kisebb magasságot kap meg - persze mindig AT_MOST megjelöléssel.
Hozzáteszem: a Custom View onMeasure metódusa MINDIG egy fix magasságértéket ad vissza - ami viszont természetesen nagyobb, mint fent a negyedik érték.Itt vált gyanússá, hogy használnom kellene ezt a bizonyos bitet. De akár beállítom, akár nem, ugyanaz történik. Pedig ettől reméltem a megoldást.
A hibajelenség (lehet, hogy ettől független): A Custom View tényleges magasságmérete némileg random értéket vesz fel. Néha pontos, fekvő módban néha "odaképzeli" maga alá a Navigation Bar-t (ami egyébként oldalt van), álló módban meg néha becsúszik a Navigation Bar mögé. Tíz esetből kb 1-2 alkalommal hibás, holott a logika mindig ugyanaz. És csak elforgatás után jelentkezik a hiba, ha requestLayout()-ot kérek, akkor pontosan számol.
Sehol nem találtam ilyen hibáról leírást, és elképzelni sem tudom, mit csinálok rosszul. A teljes program túl nagy, kellene írni egy rövid tesztet, de ahhoz se kedvem, se időm. Vagy a rendszerben van a hiba, az is lehet. Bocs, hogy hosszú voltam, de tényleg a fejem verem tőle a falba.
Közben rájöttem, hogy megkerülésül minden elfordítás (és measure cycle) után kiadok egy requestLayout-ot, ami rendezi a View-t. De valószínű nem ez a korrekt megoldás.
-
thon73
tag
Sziasztok! Tudja valaki, hogy miként működik a MEASURED_STATE_TOO_SMALL flag a setMeasuredDimension() metódusban? Leírást nem találok. Hogyan változtatja meg ez a mérési ciklust?
-
thon73
tag
Sziasztok!
Egy custom-view-t készítek, ahol az oldal-méreteket a megkapott méretekből arányosan számolom. A többszöri ciklus miatt a nem-első onMeasure() hívásokban természetesen a számított oldalméreteket kapom meg (és már nem változtatok rajta). Android 6 előtt tökéletesen működött.
PROBLÉMA: Android 6 után néha az onMeasure() egy teljesen értelmetlen értéket kap, ami sem az eredeti, sem a számított, hanem a számítottnál 1-2 ponttal kisebb. Pl. 1280 a teljes magasság, 444 a számított, és akkor egyszer csak érkezik egy 441-es érték, amit én biztosan nem állítottam be soha a log alapján. Ez persze teljesen megzavarja az algoritmust.
((Arra rájöttem, hogy a navigation-bar megjelenésével lehet kapcsolatban, de nem a navigation-bar mérete "hiányzik" - azt figyelem - hanem mindig csak néhány pont.))Találkoztatok már ezzel a problémával? Nem tudom miért, és mekkora eltéréseket kapok a rendszertől, ezért nem is tudom felkészíteni az ilyen hibák kivédésére.
-
thon73
tag
Billentyűzetet írni nem egy egyszerű vállalkozás, mert alig van info. Ezt egyébként onnan tudom, hogy időközben elkészült az itt már emlegetett hatszögletű billentyűzet, ami emellett teljes mértékben személyre szabható. Vagyis olyan elrendezést lehet beállítani rajta, amit csak akarunk.
Szívesen odaadom, ha a hatszöglet nem zavaró. Viszont nem egyszerű beállítani, mert a leírás még várat magára. Kiindulási alapnak programozáshoz sem rossz, csak egy picit hosszú a programlista.Ugyanitt keresek olyan érdeklődőt, akinek lenne kedve a billentyűzettel foglalkozni. Mármint fejleszteni. Az én életem olyan (egyébként pozitív) irányban változott, hogy gyakorlatilag nincs rá időm; szívesen odaadnám valakinek, aki lát benne fantáziát. Működik, kipróbálható, nyílt a kódja stb, épp csak nincs teljesen befejezve. Viszont ketten is már folyamatosan azon írunk (nem keveset és több nyelven) és működik. Na jó, ennyit a reklámról. Ha valakit érdekel, itt a fórumon megtalál.
-
thon73
tag
Lehet, hogy nem ez a legjobb hely, de talán mégis programozás:
MAGYAR nyelvű TTS-ről tud valaki?
Készítettem egy (speciális) ebook-olvasót, és szívesen kiegészíteném felolvasással. Tudomásom szerint az egyetlen magyar tts az svox volt, ami évek óta nem frissül, sőt már nem is települ (az új gépemre).
Erről vagy bármi alternatíváról tudtok valamit? Előre is köszönöm!
(Angol stb. nyelv megy, csak éppen magyar nincs a motorokhoz.) -
thon73
tag
Csak vásárlói oldalról láttam, de soha nem néztem utána: az UNLOCK egy csomószor elfelejti, hogy unlockolva van, és netre kell kapcsolódni, hogy újra eszébe jusson. Baromi kellemetlen külföldön. Ezt biztos nem választanám soha.
Nekem legjobban a szétválasztott free és pro tetszik; ott pontosan lehet látni, hogy mit vettél meg.
(Szimpatikus a cool-reader megoldása, ami teljesen free, de vehetsz támogatói "programot" hozzá; ez kvázi az adomány helyett van. Persze ez nem fizetős a hagyományos értelemben.)
-
thon73
tag
válasz
Oppenheimer #3914 üzenetére
Vagyis simán tegyem be az onCreate-be (Activity esetén)? - és finish(), ha nem kapom meg.
-
thon73
tag
Az új permission engedélyezést hol kell/érdemes lekérdezni?
A program service és activity részeket is tartalmaz. Ami közös: mindegyik intenzíven írja/olvassa az SD-kártyát. Most tényleg minden művelet előtt le kell kérdezni a permission-t, vagy elég valahol az elején? De hol?
-
thon73
tag
Android Studio:
Kezdőként a legegyszerűbb, ha letörlöd a gépről az egészet, (a .android mappát is), és nulláról felrakod az egészet. Annak működnie kell.
DE!
A kész projektek hivatkoznak egy bizonyos beállításra, ami nem biztos, hogy megegyezik a Te verzióddal. Ilyenkor az a legegyszerűbb, ha csak a source kódot emeled be. Pl. létrehozol egy üres projektet, ahol az app mappa alatti részt nemes egyszerűséggel bemásolod a futtatni kívánt projektból. Ez azért egyszerű, mert a projekted a TE fordítódra hivatkozik, a source kód meg a másik forrásból van.
Ez a megoldás nem a legelegánsabb persze, de amíg meg nem ismered az egész felépítését, addig talán ez a legegyszerűbb. Lehet, hogy mások tudnak még jobbat is.Fragment:
Nem futtattam a kódot, de ránézésre több logikai bukfenc van benne. EZT ajánlom, itt összeírtam a saját kezdeti buktatóimat. A fragment nem egyszerű, se a logikája, se a felprogramozása. De kitartás, nem lehetetlen megtanulni.
Itt a fórumon feljebb van egyébként egy csomó link, ahol el tudsz indulni, de többnyire angol. Lars Vogel oldalai szerintem pont Neked szólnak.
Ja, és a konkrét kérdésre pl ez: [link]
-
thon73
tag
Nem létezik, hogy nem működik.
Nekem Intel D525 / 4Gb RAM és most Intel J1900 / 4Gb mellett, Linux és Windows alatt is tökéletesen működik (és kb. egyforma idővel). És ezek azért elég lassú, energiatakarékos procik; igaz SSD-t használok.
Ha kell a saját virtuális gép, akkor az lassan indul, de utána már az is gyors.Ha a fordítás lassú, akkor EZT olvasd el! Nekem négy percről pár 10 másodpercre csökkent a fordítási idő:
Settings/Build…/Compile independent modules in parallel…
Settings/Build…/Compiler/Make-project automatically…
és
SettingsBuild…/BuildTools/Gradle/Offline workmindegyikét bekapcsoltam, de ezek most egy picit máshol vannak az opciókban, úgy emlékszem.
Más:
Említetted a GitHub-ot. Az ugyan nyílt, de nem (vagy elsősorban nem) kész példakódok megosztására szolgál. Sokan fejlesztés alatt álló dolgokat tesznek fel (pl. én is), ami nem feltétlenül működik az adott pillanatban. Ezt azért érdemes előtte megnézni, mert különben nehéz belőle tanulni.
-
thon73
tag
Egy biztos: A google HQ nem úgy alkotta a rendszert, hogy ki kelljen lőni bármit is, ha nincs rá szükség.
Szerintem a kérdés megközelítése rossz - de épp emiatt nem vagyok elég okos, hogy megválaszoljam. Szóval szerintem a hiba a kilövésben van, mégpedig attól tartok, Te az egész application-t leállítod, nem csak az activity-t. De erre nincsenek pontos információm, úgyhogy cáfoljatok meg, ha hülyeséget gondolok.
A háttértől függetlenül: próbáld ki, mi történik, ha finish()-sel állítod le az Activity-t miután a service-t elindította (persze start-tal)!
-
thon73
tag
-
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. -
thon73
tag
Hát én pont azért kezdtem el (újra) programozni, mert nem találtam senkit, aki helyettem - pénzért - megcsinálja. Egyébként meg igen drága.
Fel a fejjel! Fog az menni, csak legyél türelmetes!
A világ legelvarázsoltabb service-vel játszom egy ideje, a billentyűzetvezérlővel, úgyhogy az android csavarjait nekem nem kell bemutatni. A jó hír: megy benne a háttérszál! A rossz: az asynctask még a service-nél is hülyébb állatfaj.
EZT olvasd végig, ha gondolod. Régi, de segíteni fog az asynctask megértésében. Elküldöm a készülő kódot is szívesen, de kicsit nagyra nőtt, nehéz benne bogarászni.A lényeg:
A Service megvalósít egy Listener-t, amin keresztül az AsyncTask tudja jelezni az eredményt.
Ezt a Listener-t az AsyncTask konstruktorában adom át, vagyis magát a service-t.
A Service meghívja .execute-tal az AsyncTask-ot, de a sikeres lefutást már a Listener-ben meghatározott metódusok kezelik le, amiket az AsyncTask onPostExecute metódusa hív meg.
Ez a szűk lényeg, mert az Asynctask előnye, hogy látod, hogy hol tart; ad visszajelzést a hibáról; és persze meg lehet szakítani. Épp csak ezeket is mind fel kell programozni, bár a terep elő van készítve.Internetet még nem használtam (mármint közvetlenül a programból), de az biztos, hogy az UI szál erre tiltott. Azt, hogy pontosan milyen módon teszed háttérbe a feladatot (AsyncTask, Loader, Service, Thread stb.) mérlegelni kell, de az AsyncTask-ot mindenképp érdemes behatóan ismerni.
-
thon73
tag
egyik = textResult; egyik és textResult is ugyanarra a stringre mutat (legyen stringA)
egyik = Integer.toString(Integer.parseInt(egyik)); textResult változatlan, de egyik már a toString által létrehozott új stringre mutat. (Ami tartalmazhat azonos szöveget stringA-val) Ez legyen tehát stringB."egyik == textResult" az ugyanaz, mint stringA == stringB, vagyis soha nem lesz igaz. textResult.equals(egyik) megoldás segíthet, de miért nem számolsz inkább integerekkel az átalakítás után?
A masik=egyik; utasítás viszont a fenti ellentéte, hiszen ettől kezdve mind a kettő ugyanarra a stringA-ra mutat, tehát értékük egyenlő.
Java-ban ezt egy picit nehéz megérteni, mert el van rejtve. A C pl. sokkal jobban rákényszeríti az embert a címaritmetika elsajátítására.
A String alapvetően egy Objektum, amely valahol egy komplex adathalmaz a memóriában.
Pl. String string = "Én egy adathalmaz vagyok"; utasításban lesz a memóriában egy ilyen mondat.
Ezzel szemben a "változó", amivel azonosítjuk a stringet, valójában egy mutató, ami erre az adathalmazra mutat. String esetén az adathalmaz final, vagyis nem változtatható meg, de a string nevű mutató természetesen mutathat más halmazra, ha új értéket kap.
Te azt hasonlítod össze, hogy a két mutató ugyanoda mutat-e, ahelyett, hogy a két mutató által mutatott adatokat hasonlítanád össze. -
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
Még mindig PreferenceActivity.
Bár nem sikerült még a material kabátot ráadni, de máris olyat szeretnék, hogy a header dupla pane elosztása jelenjen meg a 8 inches gépen elforgatott képnél.
Eljutottam a public boolean onIsMultiPane() metódusig.
Milyen paramétert kellene megvizsgáljak ahhoz, hogy kiderüljön, hány inches a képernyőm? -
thon73
tag
Használt már valaki AppCompatDelegate-ot? Csak annyi, hogy pl. a PreferenceActivity minden metódusából meghívom a Delegate megfelelő metódusát és kész? Onnantól kezeli pl. a headereket? és honnan lesz benne toolbar ettől?
Gondoltam megmodernizálom, sőt megmaterializálom a settings-et (is). Listák vannak a bugokról benne! Hogy lehet valami ennyire trehány módon megcsinálva?Na mindegy, pontról pontra kijavítgattam mindent, de a headereknél elakadtam.
Előre is köszönöm, ha valaki utat mutat -
thon73
tag
Sianis tette fel a kérdést:
"Hogyan lehet a stílusokat úgy használni, hogy hasonlítsanak a különböző API verzió között?"Erre nem érkezett válasz, de én is erősen csatlakoznék a kérdezők táborához. Csak tanulgatom a material design megjelenést, de nekem két készülékem sem egymáshoz sem a példához nem hasonlít... A maga nemében persze mindegyik működik, csak olyan jó lenne érteni, hogy hogyan...
-
thon73
tag
To (#3789) CyborGabe: Másodszor meg ott a válasz pont a kérdésed felett.
Egy overlay activity-t szeretnék tenni egy térkép alkalmazás felé, csak azért, hogy a kocsi ablakában egy érintéssel tudjam sötétíteni/világosítani a képet. Már olvasgattam az ügyben, de két kérdésre nem találok választ:
1. Ha elfedem az activity-t egy másik (részben átlátszó) activity-vel, akkor az alsó továbbra is működni fog? Vagyis a térképszoftver továbbra is mutatja az utat?
2. Miként adom át az érintéseket magam "alá", vagyis a térképszoftvernek? Elegendő, ha nem fogom el azokat? Automatikusan átadja az alatta lévő (átfedett) viewnak?
Előre is köszönöm! Mielőtt nekiállok, ezt azért érdemes lenne tudnom.
Vannak amúgy ilyen alkalmazások, de azt nem tudják, hogy a képernyő érintésével változzanak. Én meg nem akarom vezetés közben huzigálni a statussort.
-
thon73
tag
válasz
Nestor16 #3787 üzenetére
Úgy látszik, mindenki nyaral... Jó nyaralást mindenkinek!
Konkrétan miről lenne szó? Mert valahogy mindenki így akarja elkezdeni...
Személy szerint azt ajánlom, hogy érdemes az android saját UI "elemeivel" építkezni először: szöveges bevitel, szöveges kiírás, gombok, huzigák, pirítósok stb. Ha ez megy, akkor már valamelyest át fogod látni az android logikáját.
Teljesen külön világ, ha grafikát, különösen ha mozgó grafikát akarsz kezelni. Már egy egyszerű ún. custom view sok izgalmat rejt - vagyis ha közvetlenül akarod a képernyőérintéseket kezelni, meg azon egyszerű grafikát megjeleníteni. Én ennek csak második lépésben álltam neki.
Nagy kérdés a tárolás, ami szintén sok android sajátosságot tartalmaz; az sqlite meg egy külön nyelv. És akkor még minden egyes kütyü kezelése külön-külön tanulnivaló, pl. ha döntögetni akarod a gépet.
Ettől függetlenül egyik sem ördöngősség, csak talán egyszerre az egész túl nagy falat; meg talán minden porcikájára nem is lesz szükséged.
Szerintem maga az android dokumentáció többnyire elég jó (kezdőként főleg a komplex cikkek), egy konkrét problémára meg a http://stackoverflow.com/, bár a google is odavisz.
Lars Vogel oldalán nagyon jó tutorialok vannak: http://www.vogella.com/tutorials/android.html
Haszonos oldalak, ahol érdemes körülnézni:
www.grokkingandroid.com, www.androiddesignpatterns.com, http://www.tutorialspoint.com/android, http://www.codeproject.com, http://www.androidhive.info/
Pár éve én is leírtam, hogyan kezdtem az egészet, aztán ez megszakadt. De talán itt is lehetnek hasznos dolgok: android.lattilad.orgAztán végül, de korántsem utolsó sorban; vagy ha az angollal elakadsz, akkor a konkrét problémára általában itt is találsz választ.
Jó munkát!
-
thon73
tag
Tudna valaki linkelni, (vagy írni) egy rövid útmutatót, hogy
Hogyan lehet egy régi projektet appcompat kompatibilissé tenni?
Egy csomó mindent átállítottam, de most sem vagyok biztos abban, hogy mindent megcsináltam. Ha lehet induljunk ki egy Activity vagy FragmentActivity source-ból és egy teljesen új projektből. Hálásan köszönöm előre is, mert a neten lévő rengeteg útmutatóban teljesen elvesztem. -
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.
-
thon73
tag
Most vettem észre, hogy eltűnt az Activity neve a felső sorból.
Egy egyszerű WebView activity-hez adtam volna hozzá a progress-bart, csak szegénynek nincs hol megjelenítenie.
API 16 min. és API 23 compile beállítások mellett. A program alapvetően egy service, kizárólag a preferences és ez a webview activity benne.
Meg tudjátok mondani, hogyan tudom a címsort visszaszerezni a legegyszerűbben? -
thon73
tag
startActivity kapcsán szeretnék segítséget kérni - service alól indítok egy külső programot package-name alapján (pl. jota editor)
Intent intent = ...Context().getPackageManager().getLaunchIntentForPackage("jp.sblo.pandora.jota");
if ( intent != null )
...Context().startActivity(intent);
Az indítás tökéletesen megy is, de elakadtam a Flag-ek kérdésénél:Milyen flageket kell beállítani ahhoz, hogy ha már fut a program, előre hozza (tehát ne legyen új példány belőle); ha még nem fut akkor pedig elindítsa? Vagy a PackageManager ezt is elintézi helyettem?
Megj.: Amikor a saját activitymat indítottam (service alól) akkor csak a NEW_TASK és SINGLE_TOP segítségével tudtam működésre bírni, de igazából ezt sem értem, hogy miért. Csak újat tudtam készíteni, a régit nem tudtam elővenni; vagy két példány futott.
Intent intent = new Intent( ...Context(), PrefsActivity.class);
intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
// intent.addFlags( Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT );
// intent.addFlags( Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY );
intent.addFlags( Intent.FLAG_ACTIVITY_SINGLE_TOP );
// intent.addFlags( Intent.FLAG_FROM_BACKGROUND );Minden segítséget nagyon köszönök, azt is, ha egy megbízható és működőképes összefoglalóhoz irányítotok. (Egy tucat egymásnak ellentmondó oldalon végigrágtam magam...)
To flash: Saját tapasztalatom alapján van még egy gond: egy "saját ötlet" többnyire nem fér bele extraként egy jó programozó-csapat életébe. (És megoldott harmadik kategóriás költségről beszélünk.) Egyébként eldobni nem érdemes egy jó ötletet, talán el lehet adni; vagy (és én ezt választottam), némi számítástechnikai ismerettel meg tanulással az egyszerűbb dolgok meg is valósíthatóak. Addigra az is kiderül, mennyire célszerű pénzt és időt invesztálni az ötletbe.
-
thon73
tag
válasz
[KgP].Robot #3708 üzenetére
Velem akkor történt ilyen, amikor az sd-kártyát akartam elérni; az ugyanis nincs jelen a bekapcsoláskor. (nem fagyott ugyan le, hanem hibaüzenetet adott.) Esetleg valami hasonlóan működő periféria?
-
thon73
tag
Biztos? [link]
Az adó összege nyilván elhanyagolható lesz, vagy akár nulla, de a cikk szerint akkor is foglalkozni kell vele. Esetleg érdemes lenne magát az adóhatóságot (vagy egy könyvelőt) megkérdezni. Gondolom, a bevallás kitöltése egy ilyen egyszerű bevételnél nem jelenthet nagy problémát. -
thon73
tag
Tudja valaki, hogy font esetén az ascent és descent értékeket milyen mértékegységben kell értelmezni?
A Paint.getTextBounds() segítségével áthidaltam megoldottam ugyan a problémát ("y" esetén a bottom érték megadja ezt). DE sem az arány sem az összeg nincs összhangban a kapott ascent/descent értékkel, mely egyébként a mérettől függően változik. (Csak úgy érdekelne a teljesség kedvéért.)Bocs, ha nem androidosnak tűnik a kérdés, de az egyetlen válasz, amit találtam, a DIP volt, amit pl. az Android egészen eltérően értelmez a pl. a Windows-tól. Amúgy ezzel sem tudtam értelmezni.
-
thon73
tag
MotionEvent/getPressure kapcsán lenne kérdésem:
DOWN kapcsán csak egyetlen MotionEvent értéket kapok. MOVE csak akkor kezd el tüzelni, ha egy bizonyos távolságra elmozdulok.
Nekem az egyetlen és nem mozduló "DOWN" érintés nyomásváltozására lenne szükségem. Meg tudom szerezni ezt az értéket valahonnan?
(A hardver legalább szimuláltan (getSize) tud értéket szolgáltatni, szóval a mozgásban változó nyomásértékeket kapok. A másik készülék Wacom tollal DOWN esetén is folyamatosan tüzel, nyilván fel van készítve a toll nyomásváltozásainak érzékelésére.)
Esetleg játékot készítők találkoztak már a problémával? Vagy van valami mód az érintés lekérdezésére (MotionEvent, azaz onTouchEvent() nélkül)?
Köszönöm! -
thon73
tag
Elég kevés adat is elég a szinkronizáláshoz. Töltsek fel Google Drive-ra egy kis file-t, amit a másik program leszed? Egyébként nekem is ez a "felhő" megoldás a legszimpatikusabb.
De mit tegyek akkor, ha nincs net (külföld pl.)? Bluetooth? Mennyire lehet ezt automatizálni? Gondolom a BT eszközt kézzel kell bekapcsolnom, mert azt nem engedi (nyilván) a rendszer a programnak, de a többit már lehet programozni? Bocs, de ilyesmivel még semmi tapasztalatom nincs, bluetoothban kb. az autó hifi-rendszeréig terjedek... De ezt is el kell kezdeni valahol. -
thon73
tag
Készítettem egy e-book reader-et (tudom, van már sok), és azon gondolkozom, mi lenne a leghatékonyabb módszer arra, hogy a tablet és a telefon között szinkronizáljam, hol tartok az olvasásban. Ez egyébként más programoknál is hasznos funkció lehet. Alapfeltétel, hogy nem mindig vannak hálózat-közelben; bár ha igen (és ez gyakori), akkor mindkettő azonos hálózaton. NFC nincs az egyikben (bár ez sem kizáró szempont). Fontos szempont (lenne) viszont, hogy a lehető legkevesebb külső beavatkozással történjen a szinkronizálás. (Vagyis pl. ne kelljen kézzel bluetooth-pair-t csinálni, wifi tetheringet stb.) Esetleg a szituációtól függően kombinálva ezeket?
Köszönöm, ha elmondjátok a véleményeteket! -
thon73
tag
Megint belefutottam egy érdekes problémába:
A billentyűzet (Service) automatikusan elindul amikor a gépet újraindítom. Amikor viszont a service újraindul, akkor az adatokat is újra be akarja tölteni az SD kártyáról, ami viszont ebben a fázisban még nem elérhető. Értelemszerűen hiányzó adatok üzenettel megáll.
Miként tudhatom vajon meg, hogy újraindítás (vagy pl. kártyacsere) van folyamatban, és várakoznom kell a kártya megjelenésére? Ill. azt, hogy a kártya már él? Azt fontos lenne elkülönítenem, hogy ne is számítsak adatokra, mert pl. nincs SD kártya ill. hogy jelenleg éppen ugyan nem elérhető, de várhatóan hamarosan lesz sd kártya.
((Az "adatok" természetesen nem a futó billentyűzet adatait jelenti, hanem a billentyűzetet leíró szöveges file-t, aminek alapján a billentyűzetet legenerálja. Szóval ezt szeretném az SD-n hagyni, mert ott könnyebb vele - pl. egy szövegszerkesztővel - dolgozni.))
Előre is köszönöm!
-
thon73
tag
válasz
WonderCSabo #3631 üzenetére
Tyű! Pontosan ezt szerettem volna, csak nem tudtam, hogy ezt szeretném. Vagyis, hogy ezt így hívják. Így viszont már találtam is plugint, ami ki is rajzolja; majd kipróbálom. Azért ezzel még kell egy kicsit játszanom, mert igen sok adat van benne...
Nagyon köszönöm! -
thon73
tag
válasz
WonderCSabo #3629 üzenetére
2. Bookmarks! Ez az! Pont erre volt szükségem! Remek. Nem tudom, miért nem láttam ezt idáig, pedig kerestem, igaz, nem ezzel a szóval.
1. A Find Usages nagyon jó, azt használom is, csak van néhány osztályom, ami "egymásba ágyazódik". Pl. Van egy közös alap-adatokat tartalmazó Data, van benne néhány billentyűzet-layout Board, van benne sok-sok billentyű Button, abban meg néhány felirat Title. Nomármost: mindenki az előzőt látja, nem az összeset. A Data ismeri (egy interface-en keresztül) magát a fő Service-t. Ahhoz, hogy a Title hozzáférjen a Service által biztosított metódusokhoz, vissza kell nyúlni a saját Button, annak a Board osztályán keresztül a közös Data osztályig, aki biztosítja számára a Service által megvalósított interface-t. Igazából a valóságban egyszerűbb, mint így leírva.
Arra gondoltam, hogy van-e esetleg olyasmi, ami ezt valami hasonló módon felrajzolja. Mert ugye elvileg látnia kell, hogy pl. a Button osztályban van Board hivatkozás, de pl. Data hivatkozás nincs.
Aztán persze lehet, hogy őrületes butaság, amit kérdezek, és nem is létezik ilyen, vagy én csinálok valamit apokrif módon... -
thon73
tag
Apró technikai kérdések:
Az Android Studio tud-e olyat, hogy az osztályok közötti összefüggéseket kikeresi? Vagyis: ki hivatkozik kire. Eddig papíron csináltam, de lehet, hogy van erre valami szofisztikáltabb módszer is.
A másik pedig, hogy lehet-e esetleg a Studion belül megjelölni szövegrészeket? Most egy csomó hely között ugrálok, és ebből néhány ráadásul egy osztályon belül van. Olyan jó lenne, ha egy mozdulattal tudnék ide-oda menni, és nem kellene keresgetni a sorok között, hogy visszataláljak. Eddig csak olyat találtam, ami az előző helyre visz el, de ilyen ugrálósat nem láttam.
Köszönöm, ha valaki látott már ilyet! -
thon73
tag
Nagy-nagy köszönöm!
már olvasgattam egy ideje, de még egyik cikk sem foglalta össze ilyen jól! (Vagy valószínűleg túl részletes volt.)Konkrétan egyébként továbbra is a billentyűzet téma, ami az egyik gépemen tökéletesen működik, a másikon tökéletesen nem - mert nem ad onTouchEvent jelet, ha nincs mozgás.
Az "leütés" után hosszabb a várakozási idő, mint az ismétlések között = ez egyszer két időintervallum. Bizonyos billentyűk nem ismétlik önmagukat, hanem két jelentésük van. Az egyik mód a másodlagos jelentés előhozására, ha hosszan tartom. Ilyenkor a két jelentés váltakozik, de mindig a "hosszú" idő után. A logikus számomra az volt, hogy meghívom a "jelentést", vagyis amit a billentyű csinál, és az adja vissza, hogy a továbbiakban hosszú vagy rövid várakozás kell a következő tick-hez.
De a fentiek alapján már prímán meg fogom tudni csinálni, köszönöm!Érdekes egyébként, hogy a billentyűzettel kapcsolatos dolgokról alig van valami szó ((jó, ez a kérdés nem pont billentyűzettel kapcsolatos)); és rengeteg illogikus vagy rosszul dokumentált rész van benne. Pedig nagyon izgalmas része lenne egy érintőképernyőnek.
-
thon73
tag
Bocs, én csak amatőr programozó vagyok, és csak egyszer használtam ilyet.
Valamiért az volt bennem, hogy lesz egy háttér "ütemadó" szál; de ez a válasz teljesen megvilágított. Így akkor el sem hagyom az UI-thread-et! Végül is teljesen logikus. Köszönöm!Még egy apró (és alap) kérdésem lenne:
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.
Amikor érintés történik, akkor kiadok egy mHandler.postDelayed() utasítást. Az ebben lévő runnable csak meghívja a custom View egyik metódusát, ill. utána ismét kiad egy mHandler.postDelayed() utasítást, amivel a saját maga után érkező "tick"-et indítja.Hogyan tudom ezt az egészet megállítani? Kiadok egy mHandler.removeCallbacks() utasítást? 1. De mi lesz ebben a runnable? Vagy egy runnable-vel meg tudom csinálni a fenti sort? 2. Azonnal megáll a végrehajtás, vagy a következő "tick" még lefut? 3. Ha leállítom, akkor rögtön indíthatok egy ugyanilyen ütemet, ugyanezekkel a példányokkal?
Előre is köszönöm, és bocsánat az alapvető kérdésekért. De nekem nagyon sokat segítettetek!
-
thon73
tag
válasz
WonderCSabo #3615 üzenetére
Találtam ilyet: Timer, ami helyett a ScheduledThreadPoolExecutor-t ajánlja. Ill. ilyet: TimerTask (és még CountDownTimer-t is.) Meg persze a Handler.
Szóval a Handlert érdemes választani.
-
thon73
tag
"a vizsgakon csak olyan kerdes teheto fel, amire a valasz megtalalhato a tantargy hivatalos jegyzeteben." - ezt minden egyetemen tudják? Amúgy egyetértek. Azzal főleg, hogy kell szólni a tanárnak, legalább visszajelzése legyen.
Nekem viszont lenne egy kifejezetten Android kérdésem:
Melyik időzítő mechanizmust a legjobb használni, ha az UI szálon 50-300 ms-ként kell egy metódust triggerelni? Fontos, hogy az időzítést meg lehessen szakítan.
((A bőség zavara. Háttér: Az onTouchEvent MINDEN érintés le/érintés mozgás/érintés fel-re reagál, de az egy helyben tartott érintésekre csak akkor, ha egy bizonyos minimális mértékben előtte mozdult. A "minimális mérték" sajnos gépfüggő és nem módosítható beállítás, esetemben elég nagy. Emiatt a "repeat" érintések nem érzékelhetőek, erre keresek egy kerülő utat: érintés le indítja az ütemjelet, érintés fel megszakítja.))
-
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.
-
thon73
tag
Találkozott valaki ilyesmivel?
Van egy custom view egy custom onTouchEvent kezelővel. Az egyik készüléken (Note 8) a program kifogástalanul működik.
Egy másik készüléken (SGSII 4.1.2) ugyanaz a program az "álló" érintésekre csak néha hívja meg az onTouchEvent-et. Minden más tökéletesen megy, az összes mozdítás/fel/le, de ha az ujj megáll; nincs hívás - én meg nem tudom az ismétlést figyelni.
Írtam rá direkt egy tesztprogramot, biztos rossz a készülék. Az meg megy. Na most akkor?Hol lehetne tovább menni az onTouchEvent vonalán, és korábban ellenőrizni, hogy egyáltalán hol akad el az érintés? Foglalkozott valaki ilyesmivel? Minden jótanácsot szívesen veszek!
-
thon73
tag
Hát, én itt fentebb majdnem azonos kérdésben akadtam el.
Ami számomra kiderült:
- Korábban úgy tudtam, hogy a projekt közvetlenül nem átvihető két AS között. GitHub-on keresztül ez biztosan nem így van, két gépen is használom ugyanazt a projektet. De kézzel - a teljes projektet - átmásolni nem tudtam. Ez persze egyébként megfelelően beállított projekt ill. két azonos AS között szól.
- Minden, amivel a fordítás történik a projektben van megadva. Ezeket át tudod nézni, ha az 'Open Module Settings (F4)'-et megnyomod a projekt nevénél. PL. a gradle verziója, sdk verziója, helye stb. mind itt van. Szerintem nálad itt lesz az eltérés, de érdemes egy új projektből "puskázni".
- De ez nem elég, mert nekem pl. gradle.properties file tartalmazza a proxy beállításokat (néha (!) automatikusan beállítja). A fordítás nem megy a nem-proxy-s gépen, ha ez be van állítva!Talán a legegyszerűbb (nálam így volt):
- készítettem egy új projektet, azonos beállításokkal (pl. package name).
- bemásoltam ebbe a lényegi részeket (ez nagyjából a 'main' alatt) a régi projektből - előbb persze töröltem az újat
- érdemes a git mappát is átmásolni, hogy megmaradjon
VAGY
- a TC-ben szépen minden settings file-t összehasonlítgattam az új és régi projektben, abból rájöttem, hogy mi van rosszul beállítva.A két gépemen (ráadásul egyik linux, másik win) sokszor másolgattam két projekt main "belsejét", mindkét gépen külön-külön létrehozott projekt "külső" között. Ez minden további nélkül ment. (Sőt, volt egy harmadik játékos is: AIDE a tableten, az is ment ugyanígy.) De a github-on, miután be bírtam üzemelni az összes proxy-s elérést, ez sokkal egyszerűbb.
De a projekt és a fordító alkatrészek verzióját semmi nem szinkronizálja. Pedig logikus lenne valami kapcsoló, ami a projektet a legújabb AS/gradle/sdk verzióra emeli. Én nem találtam ilyet.
Remélem, segítettem
-
thon73
tag
Ezt pl. nem találtam meg. Lehet, hogy rögtön az elején megoldotta volna a problémát.
Fel sem merült bennem, hogy a jdk-t projektenként kellene beállítani.Ez egyébként azt jelenti, hogy minden egyes projektben változtatni kell, ha a JDK változik?
Már az alapmappában komoly eltérés van a gradle.properties és build.gardle file-okban. Nem mintha ezt nem lehetne épp javítani kézzel, csak csodálkozom, hogy ezek miért nem lépnek tovább, ha a környezet változik.
Az .idea-t kiveszem. Akkor azt majd mindig létrehozza? Ill. miért nem így van ez a gyári beállításban? (Na jó, ez az utolsó költői kérdés volt.)
Köszönöm!
-
thon73
tag
válasz
bucsupeti #3587 üzenetére
Valóban, a frissítés - egy elakadáson kívül - nekem sem okozott problémát. A projekt minden frissítés után szépen működött tovább.
Most véletlenül vettem észre, hogy az AS egy régi JDK-t használ, noha volt már újabb is a gépen. Speciel úgy vettem észre, hogy letöröltem a régit, és nem volt hajlandó tovább működni. JDK könyvtár/file beállítást (tehát nem a Java verzió beállítást) nem találtam sehol az IDE-ben; viszont szöveges kereséssel tele volt vele az összes settings file. Először is ezt nem akartam kézzel átírogatni.
Másrészt rengeteg maradvány volt a régi AS-ekből, szépen elnevezve mindegyik. Így aztán fogtam az egészet és letoltam a gépről az összes ide tartozó file-t. ((Az az én bénaságom, hogy közben véletlenül töröltem a mentett beállításokat, majd visszajátszom a színeket...))
Az új telepítés, némi proxy szívás után, tökéletesen futott egy MyApplication nevű csodálatos programmal
GitHub-ról levettem a projektet, amin dolgozom; és itt kezdődtek a bajok. Hiába frissítettem az AS-t többször, ez a projekt még mindig az ősrégi gradle-re, meg egyéb (pl. proxy) beállításokra mutogatott. Ez gyakorlatilag az összes alapkönyvtárban lévő beállításra igaz. No, itt akadtam el - egyszerűen nem hiszem, hogy ezeket csak kézzel lehet átírni. A projectet egyébként importáltam is (megnyitás helyett), de semmi nem változott. Merthogy a doksi ezt javasolja ugyanis.
Végül visszanyúltam az ősi megoldáshoz: csináltam egy azonos nevű, de kódot nem tartalmazó projektet, a beállításokat megtartottam abban, míg a source-file-okat a régiből (gittel együtt), szépen belemásoltam kézzel. Mármint AS-en kívül. Azóta csak egyet nyavalygott: nem találta az AS-ben a git root-ot, de ezt javította. És csodák csodája, a github is fogadta az "új" projektet. HOgy az otthoni (linuxos) rendszer mit fog majd szólni, nem tudom.
Két kérdés maradt nyitva bennem:
1. a projektek tényleg nem frissülnek az AS/Gradle frissítéssel?
2. ezt az egész miskulanciát most tényleg kézzel kell megcsinálni? Nincs ez automatizálva valahol?Ez egyébként azért is gond (szerintem), mert jön valaki, aki Androidot akar programozni. Feltolja az AS 1.5-t (most már 1.5.1-et), majd letölt próbaként egy programot a githubról. És akkor az tényleg nem fog menni, mert egy korábbi verzióhoz ragaszkodik?
Egyszerűen nem értem az egészet. -
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
Két - egymástól és emulátortól is független - kérdésem lenne:
1. Észrevettem, hogy a JDK lemaradt, csak a JRE-t frissítettem. Pótoltam a hiányosságot, és azzal a lendülettel le is töröltem a korábbi verziókat. Az Android Studio (konkrétan a gradle) azóta nem akarja az igazságot. Egy sokkal régebbi JDK-t keres.
Be lehet ezt valahol állítani? Sehol nem találtam ilyet, a JAVA_HOME megváltoztatása pedig nem segített (Bár attól legalább az AS elindult) A kérdés hosszútávra is vonatkozik, gondolom lesz még majd újabb Java verzió is.2. StartActivity alatt flag-ek beállítása szükséges ahhoz, hogy service alól elindítható legyen. Eddig eljutottam, de konkrétan milyen flag-ek beállítása szükséges? Létezik ehhez valami leírás?
A gondom az, hogy az Activity elindul, de nem feltétlenül tér vissza a kiindulási pontra, hanem a saját csomagjában lévő másik Activity jön fel - már ha el volt indítva előtte. Ezt meg tudom vajon oldani valahogy?Előre is köszönöm a segítséget!
-
thon73
tag
Az vajon miért van, hogy update esetén a Linux alatti Android Studio azt írja ki, hogy Update, és update-eli is magát, míg a Windows alatti azt írja ugyanott, hogy Download, és elvisz a Canary Chanel-re? Elállítottam valamit? De kikényszeríteni sem tudom az update-et.
-
thon73
tag
Nem drag&drop, hanem egy billentyűzet. A billentyűzeten az ujj felemelése nélkül (is) lehet gombokat megnyomni. A tapasztalat azt mutatta, hogy a layout-váltó gombokat is jó lenne ebbe belevenni. Ezt csak úgy lehet megoldani, ha a View azonos marad (mert különben az érintés CANCEL-lal megszakad), csak a layout/méret változik.
Ez az egész tökéletesen működik, kivéve, hogy a layout-váltó elérésekor kiadom a parancsot a layout módosítására, de az nem történik meg azonnal; ki se tudom kényszeríteni, hogy azonnal megtörténjen. Persze ki lehetne kerülni az egész onMeasure mérést, hiszen a képméret ismert, és a futás során nem változik (legfeljebb a két szélesség váltakozik, de akkor tényleg meghívásra kerül az onMeasure.)Végül a lényeg csak annyi, hogy a requestLayout() kiadása után egy csomó onTouchEvent (40-50 db!) még a régi View-n történik. Ezzel számolni kell.
-
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
View-ban otthon lévő szakértőtől szeretnék segítséget kérni.
Van egy custom view, custom onTouchEvent(MotionEvent event) metódussal.
A MotionEvent.ACTION_DOWN ág meghív egy requestLayout()-ot, mivel a kép mérete az érintésnél változik. Az odáig tiszta, hogy a kép újraméretezése később kerül meghívásra.
A kérdésem az, hogy MIKOR, merthogy van egy MotionEvent.ACTION_MOVE ág, ami már egy következő onTouchEvent() hívásban aktiválódik, de ebben még nem fut le a requestLayout (pontosabban az onMeasure()) és emiatt nem tudok a képmérettel dolgozni.
Valahogy ez történik: ÉRINTÉS - ekkor megváltozik a view - HÚZÁS - ez meg még nem tud az új mérettel kalkulálni. Szerintetek honnan lehet megtudni, hogy lehet-e már az új mérettel dolgozni?
Előre is köszönöm. Nekem csak nagyon kacifántos ötleteim vannak, pl. egy trigger az onMeasure-be (akár a méret), de nem létezik, hogy ez ilyen macerás legyen.
((Az egész View felvázolása meglehetősen összetett, persze csak az egyik rész érintése váltja ki a méretváltozást. De ez a rész működik is.))
-
thon73
tag
Nincs véletlenül valakinek egy jó ötlete kidolgozott integer alapú preference-re? Mármint az xml rész kellene, úgy, hogy ténylegesen int-et tároljon. És nem lenne rossz határérték megadása sem... Na jó, nem álmodozom.
Egyszerűen nem hiszem le, hogy erre nincs valami kész megoldás. Csak épp nem találom...
Előre is köszönöm. -
thon73
tag
Én semmit nem értek a telefon részhez, de talán segít tovább kutakodni:
A DW-tárcsázó felszíne zöldre vált, amikor felveszik. Nem amikor kicseng, hanem amikor fel is veszik. Az hogyan csinálja?
Egyébként már nekem is eszembe jutott, hogy a kicsengés lehetne kihangosított, és ha felveszik lehalkul, de ez az ötlet jobb. -
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!
-
thon73
tag
Még egy hülye kérdés, aztán hagyok másokat is dolgozni:
Ebben az elrendezésben
PreferenceManager.getDefaultSharedPreferences(getActivity())
.registerOnSharedPreferenceChangeListener(this);
PreferenceManager.setDefaultValues(getActivity(), R.xml.prefs, true); // akár false is lehetA setDefaultValues miért nem triggereli a onSharedPreferenceChanged metódust? Persze akkor, amikor még nincs preferences, és ő tölti fel a default values-t.
Van egy file-név, amit szeretnék - ellenőrzés után - megjeleníteni a summary-ban. Most tényleg két külön hívást kell csinálnom, mert a default hívás nem számít változásnak?
Vagy mit tudtam két sorban elrontani? Minden más esetben működik a trigger.
Köszönöm a segítséget! -
thon73
tag
Igen, én is láttam ezt az elrendezést; de valamiért bizalmatlan voltam. Nem fordulhat elő, hogy a fragment még nincs becsatolva, de az activity már elindult? Pl. a fekvő képernyőn van egy plusz fragment? Persze ez egy sokkal egyszerűbb helyzet.
De lehet, hogy túlkomplikáltam a dolgot. -
thon73
tag
Ígérem, egyszer végigrágom magam a dokumentáción. Elvileg teljesen egyetértek, gyakorlatilag viszont egy jó órát molyoltam azon, hogyan is kéne ezt megcsinálni. A másolás viszont pont 10 mp. volt a távoli hozzáféréssel együtt.
Van viszont egy kérdésem: kételkedek a dokumentációban.
AUsing Preference Fragments azt írja:public class SettingsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}
}Ha jól értem a fragmentek kezelését, akkor nem szabad automatikusan mindig új fragmentet készíteni, hanem meg kéne keresni a régit. Mert ha nem, akkor elforduláskor ezek szépen benne maradnak a FragmentManager-ben. Azt látom, hogy replace, de ezt szabad akkor így, vagy nem szabad így?
-
thon73
tag
válasz
WonderCSabo #3489 üzenetére
Ezt is köszönöm, gondolhattam volna, hogy itt keressem. A Build-os és Signing-os rész egymásra mutogat, és szó sem esik benne a debugról.
Ettől függetlenül a fejlesztő környezetet itt is fel kell készíteni - vagyis kell csinálnom egy közös debug.keystore-t -, ha jól értem; csak aztán ezt automatikusan tudja használni. Ennek (gondolom), az az előnye, hogy akárhová tehetem a keystore file-t.
Ez elég vicces:
Note: If you are checking these files into version control, you may not want the password in the file. The following Stack Overflow post shows ways to read the values from the console, or from environment variables.
http://stackoverflow.com/questions/18328730/how-to-create-a-release-signed-apk-file-using-gradle
We'll update this guide with more detailed information later. -
thon73
tag
Bocs, ha megint nagyon alapvetőt kérdezek.
AS-ban hogyan tudom azt beállítani, hogy ugyanazon projekt két külön gépen debugban ugyanazt a certificate-t kapja? A projektet egyébként github-ra/ról töltöttem fel és le a másik gépre (meg is változtatta az összes CRLF-et), de a debug certificate (gondolom az teljesen külön van) nem azonos.
Ha esetleg egy szájbarágós linket vagy examplet tudna valaki adni, nagyon megköszönném. Amit találtam, az ezeregyféle módszert ír le, ráadásul régi AS verziókhoz. Nem tudom melyiket használjam.
Köszönöm! -
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. -
thon73
tag
Hát, mégiscsak gondban vagyok. Nem lehet a bind-dal megoldani.
Az InputMethodService-t védik a rosszindulatú szoftverektől; nem csatlakozhat hozzá, csak a system.Alighanem egyetlen lehetőség van: privát kommunikáció az editor (jelen esetben a preferences) és a billentyűzet között. Ez engedélyezett, csak éppen nem dokumentált. Fogalmam sincs honnan szedek pl. InputSession-t, meg hogyan kommunikálok.
Vagy ahogy korábban csináltam, a Service is nézi a preferences változását...
-
thon73
tag
Igaz. Bár a kiválasztott keyboard-ot csak nem lövi ki a rendszer, de véletlen rákattintottam az AllInOne toolboxra, és az pl. kérdés nélkül kilőtte.
-
thon73
tag
Köszi mindkettőtöknek!
Éreztem, hogy valami nem stimmel. Bind amúgy működik.A keyboardra egyébként - hiába service - szinte semmi sem igaz. Folyamatosan jelen van (amíg másik billezetre nem váltasz), és elég intenzíven használja a képernyőt is
.
Szóval, nekem csak a csatolás kell; mert ez leállni nem fog soha...
Szinte fordított a helyzet: A service mindig megy, az activity meg csak akkor, ha a beállításokat módosítom.
Ezért tetszett meg ez az egyszerű módszer. De már ugrottam is, nem agyalok rajta tovább. Köszönöm! -
thon73
tag
Van egy klassz keyboard-om, ami alapvetően egy service. Ehhez készítettem egy preferences-t. Néhány esetben azonban a preferencesnek (Activity) meg kéne hívni a Service-t, hogy figyelmeztesse a változásra.
Erre szolgálna a bind, ha minden igaz.Olvastam viszont egy ötletet: [How to have Android Service communicate with Activity], mely szerint a service, mint singleton készít magáról egy static módon hozzáférhető referenciát. Vagyis: lesz egy Service getInstance() metódusom, ami vagy a futó a service-t, vagy null-t ad vissza.
Nekem szimpatikus az ötlet, ráadásul kb. két sorból megoldható. De mégis van valami "rossz érzésem" vele kapcsolatban. Minek csinálták a bind-et, ha ez ilyen egyszerű? Hibára azonban nem jöttem rá, a hozzászólást meg elfogadták.
Véleményetek szerint szabad ezt így használni?
((apropó, akkor itt is javítsam a PreferenceFragment-et PreferenceFragmentCompat-ra?))
-
thon73
tag
válasz
WonderCSabo #3466 üzenetére
De igen, csak még az Eclipse-ben. Az AS-t csak akkor kezdtem használni, amikor nagyon muszáj volt.
Amit most csinálgatok, abban pedig elég kevés az androiddal kapcsolatos rész, és sok benne az egyéb logika, meg a grafikai számítás. Ráadásul egy Service-re épül. És API16 a minimum, nem is gondoltam, hogy kell hozzá a support.
De nagyon köszönöm, mert van pl. olyan korábbi projektem, ami Loaderre épül (és használjuk is a programot) -
thon73
tag
Bocs, én AS-ban (preferncesen kívül) nem használtam még Activity-t. (Merthogy már jó ideje service-szel játszunk.) A fentiek kapcsán megnéztem a doksit, ezt írja:
dependencies {
...
compile "com.android.support:support-v4:18.0.+"
}Meg tudnátok mondani, hogy mi az a szám a végén? Ezt minden frissítéskor növelnem kell? Maga a doksi is hol 18-at, hol 21-et tartalmaz (gondolom, attól függ, mikor írták). Néha meg '+' jel van. Másrészt ezt tényleg kézzel kell beírni? Nem mintha nem lehetne épp beírni, csak szokatlan, hogy nem valami csicsás settings van hozzá.
Gondolom, ez sokaknak már teljesen egyértelmű, de talán másoknak (hozzám hasonlóan) kicsit kínai... -
thon73
tag
-
thon73
tag
Köszi! Ez egy príma ötlet! (Eltekintve az engedélyek megadásától...)
Egyébként pont az engedélyek miatt nem lesz az ideális. Egy sima billezetnek ilyen spéci engedélyek kellenek; az gyanús.
Végül inkább azt találtam ki: egy gomb rögzíti az éppen aktuális programot (vagyis, amelyikbe írunk/írhatunk), és oda tud visszatérni. Apró hátrány, hogy input-box nélkül nem látszik a billezet...
Új hozzászólás Aktív témák
Hirdetés
- Xbox tulajok OFF topicja
- E-roller topik
- Külső 3,5'' mobil rack-ek topikja
- Luck Dragon: Asszociációs játék. :)
- sziku69: Fűzzük össze a szavakat :)
- Sugárhajtómű ihlette a Zalman CPU-hűtőjét, de nem az üzemzaj tekintetében
- Milyen SSD-t vegyek?
- Sorozatok
- Spórolós topik
- Okos Otthon / Smart Home
- További aktív témák...
- Dell Latitude 7410 Strapabíró Ütésálló Profi Ultrabook Laptop 14" -80% i7-10610U 16/512 FHD IPS MATT
- Eladó Lian Li O11D MINI-X gépház
- Lenovo ThinkPad P17 Tervező Vágó Laptop -50% 17,3" i7-10750H 32/512 QUADRO T1000 4GB
- FSP DAGGER PRO ATX3.0(PCIe5.0) 850W Sfx tápegység
- Eladó PNY GeForce RTX 4070 Ti SUPER 16GB OC XLR8
- Bomba ár! Dell Latitude E6510 - i5-560M I 4GB I 250GB I DVD I 15,6" HD+ I Garancia!
- Új és használt laptopok , üzletitől a gamerig , kedvező áron. Garanciával !
- 35" ASUS ROG Swift PG35VQ curved GAMER monitor
- Samsung Galaxy S23 , 8/128GB, Kártyafüggetlen
- BESZÁMÍTÁS! Gigabyte H610M i5 13400F 16GB DDR4 512GB SSD RX 6700XT 12GB DeepCool MATREXX 40 650W
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest