Keresés

Új hozzászólás Aktív témák

  • thon73
    tag

    Sziasztok!

    Segítsetek legyetek szívesek. Pie van a az xz2 compact-omon, hogyan tudom megoldani hogy a bluetooth ne menjen a háttérbe alvó állapotba?

    Köszönöm!

    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 visszaadott Cursor 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

    Köszönöm :R

    Te amúgy ezzel hobbiként foglalkozol, vagy konkrétan dolgozol benne?

    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

    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?

    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

    inkább rakok képet az mégiscsak reprezentatívabb

    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/30948757

    Má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

    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.

    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

    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?

    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

    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.

    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

    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?

    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

    Sziasztok

    Multitouch kezelessel kapcsolatban szeretnek segitseget kerni.
    Csinaltam egy custom View-t, aminek az onTouch metodusaban kezelem a touch/move/up eventeket es minden touch helyere kirajzolok egy kort. Egeszen addig mukodik, amig nem probalom meg egyszerre 3 helyen megerinteni a kijelzot. Ilyenkor Action_Cancel esemeny erkezik az onTouch-ba. Ez elvileg akkor van, amikor a parent nem adja tovabb az esemenyt a child view-nak. Ha egymas utan lassan erintem meg 3 helyen a screent, akkor nincs ilyen gond csak ha egyszerre.
    Miert van ez es mit tudok vele kezdeni.

    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 az onAttachedToWindow() és onDetachedFromWindow() 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

    Köszönöm, mindkét választ!
    De nem.
    Igazából azt várnám, hogy eltűnjön, de valamiért már feltöltött változókkal kapom vissza. Szerintem nem ez a rendes működés, csak vmit elkavarhattam.
    Szóval, elvileg onActivityCreated-be csak üres változókkal tud belépni, ugye?

    Hoppá! Azt hiszem megtaláltam! Van egy TextWatcher() a szülő osztályban, ami a mezők visszatöltésénél beállítja az értékeket. Mégiscsak én toltam el... Köszi!

  • thon73
    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.

    Köszönöm, mindkét választ!
    De nem.
    Igazából azt várnám, hogy eltűnjön, de valamiért már feltöltött változókkal kapom vissza. Szerintem nem ez a rendes működés, csak vmit elkavarhattam.
    Szóval, elvileg onActivityCreated-be csak üres változókkal tud belépni, ugye?

  • 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

    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.

    Megkérdezhetem, melyik ez a pályázat? Akár PÜ-ben?

  • thon73
    tag

    Pontosan átbeszéltük mire van szükségünk, és csak azokkal indulunk ami feltétlen kell bele. Később még tudjuk bővíteni a megbeszéltekkel. Az árban van egy év support is, ami magában foglalja a friss anyag feltöltését is.

    Elég nagyok a piacon, korrekt cégnek tűnik és nem egy 5 emberes sufnicég.

    kp. meg én is meglepődtem, de ez Magyarország. Ez van...

    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

    Ettol feltem. :S
    Az sem szamit h szinte ugyanaz a Rom csak az egyik Nougat a masik meg MM? Igazabol nem is tud sokkal tobbet, csak mashogy nez ki.

    Esetleg azt meg tudom csinalni, hogy mas szinu legyen a statusbar? Persze ezt is system-en belul.

    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! :R

  • thon73
    tag

    Nem gondoltam h ennyire bonyolult. :S

    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

    Sziasztok! :)

    Segítségeteket szeretném kérni egy kis billentyűzet customizálás ügyében.
    Erre adódik több lehetőségem (egyben ezáltal kérdésem is :P).

    1. Eset - ezt jobban pártolnám -
    Kicsit keresgéltem az interneten és megtaláltam a google billentyűzet megoldásának a forrását (LL-hez).
    Ezen a helyen: LL-LatinIME-Source
    Na már most ezt le is töltöttem és próbáltam valamilyen úton módon beimportálni az Android Studioba de sajnos nem sok sikerrel jártam. (ellentétben a 2. esetben) Habár annyit tudok hogy a native kódokat is hozzá kell adni (ehhez le is töltöttem az NDK cuccokat). De sajnos továbbra se jutottam előrébb, hogy sikeresen betudjam importálni, hogy abból egy buildelhető példányt tudjak szülni.

    - Nos a kérdés az az lenne, hogy hogyan lehetne megoldani azt hogy ebből egy buildelhető példány legyen ?
    (Ha valaki esetleg megcsinálja, és leírja nekem hogy hogy csinálta annak iszonyatosan meghálálom!)

    2. Eset - ez RÉSZBEN sikeresen megoldva -
    Találtam az interneten egy olyan nevű billentyűzetet, hogy: Hacker's Keyboard amelyhez találtam is forráskódot. - Ezt sikerült is beimportálni, buildelhető példányt csinálni belőle. (Y) - Az általam preferált módosításokat sikerült is megcsinálni.
    Ami azok voltak, hogy a magyar nyelvű gomboknál a qwertzuiop karaktereknél a számok 1234567890 legyenek a hint label-ben. Továbbá az elrendezésén a popup keyboardnak kicsit változtattam (ahol megjelennek az ékezetes karakterek - az alt karakterek közül néhányat kiszedtem vagy hozzá adtam).
    Na már most a problémám az az hogy ha mondjuk egy 'u' karaktert hosszan nyomok (és az alt karakterek az alábbiként vannak megadva: "úű7ü") akkor mindig az 'ü' karakter lesz az első nem a '7'es a kijelölésben. (mígy az 1. esetben a billentyűzetben a szám az első :\)
    Erre a helyzetre van valakinek ötlete ? :\ (Az az, hogy olyankor amikor számos gombot nyomok akkor a szám legyen az első de a jól megszokott elrendezésben -> az az "úű7ü" nem "úűü7")

    Remélem nem volt katyvasz az egész ahogy leírtam :\ - Ha valaki érez magában annyi jófejséget, hogy segít azt nagyon meghálálom :3 (Ha valahogy megtudom :P) - Továbbá ha kell forrást is megosztom (amiket én csináltam).
    Előre is köszi ! <3 :)

    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. :)

    :Y

    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

    :F A google TTS-ben van magyar? Letölthetően? Csúcs! Köszi, a legkézzenfekvőbbet nem néztem meg. :R

    Találtam egy ilyet: Vocalizer
    Úgy tűnik, ez az SVOX utódja. (Nehéz volt meglelni, mert A Nuance készíti, de Code Factory néven.)
    Csak ha valaki magyar hangot használna a programjához. Sztem. élethűbb, mint a google.

  • thon73
    tag

    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.

    :F A google TTS-ben van magyar? Letölthetően? Csúcs! Köszi, a legkézzenfekvőbbet nem néztem meg. :R

  • 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). :W
    Erről vagy bármi alternatíváról tudtok valamit? Előre is köszönöm! :R
    (Angol stb. nyelv megy, csak éppen magyar nincs a motorokhoz.)

  • thon73
    tag

    Melyik a jobb verzió? Mit használtok, ha használtok fizetős alkalmazás esetén?

    1. Külön free és pro verzió.
    2. Free verzió + in app purchase.
    3. Free verzió és unlock alkalmazás.

    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

    Ha nem akarod túlcsicsázni, akkor az app első indításakor elkéred az engedélyt, és többet nem kell. Ha nem adja meg, akkor meg ne induljon el az app.

    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?
    :F :F :F

  • thon73
    tag

    Az sem mindegy?
    MainActivity.java
    package com.example.csabi.rohadjmeg;

    import android.app.FragmentTransaction;
    import android.os.Bundle;


    import android.support.v7.app.AppCompatActivity;

    public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentTransaction valami;

    FragmentTransaction ftc = getSupportFragmentManager().beginTransaction();
    BlankFragment fragmentDemo = BlankFragment.newInstance(5, "my title");
    ftc.replace(R.id.tvFragText, fragmentDemo);
    ftc.commit();
    }
    }

    BlankFragment.java
    package com.example.csabi.rohadjmeg;

    import android.os.Bundle;
    import android.support.v4.app.Fragment;

    public class BlankFragment extends Fragment {
    // Creates a new fragment given an int and title
    // DemoFragment.newInstance(5, "Hello");
    public static BlankFragment newInstance(int someInt, String someTitle) {
    BlankFragment fragmentDemo = new BlankFragment();
    Bundle args = new Bundle();
    args.putInt("someInt", someInt);
    args.putString("someTitle", someTitle);
    fragmentDemo.setArguments(args);
    return fragmentDemo;
    }
    }

    Activity_main.xml
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <fragment
    android:name="com.example.csabi.rohadjmeg.BlankFragment"
    android:id="@+id/fooFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

    </LinearLayout>

    Fragment_blank.xml
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="200dp"
    android:layout_height="200dp" >

    <TextView
    android:id="@+id/tvFragText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:text="" />

    </RelativeLayout>

    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

    Ú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

    Csak úgy érdeklődésként: HÁNYAS Windoz csinálja ezt?
    to bucsupeti:
    SSD mellett is érdemes RAMdisk-et használni? Korábban (HDD mellett) volt, de nekem a több memória előnyösebbnek tűnt. Linux/8GB

  • thon73
    tag

    Nekem 2012-es a gép, i5 2,7GHz mittudomén hány mag, a mai gépek sem tűnnek sokkal izmosabbnak. Android Studio alatt folyamatosan tölt és maxon a memória, már a vírusírtót is letiltottam. Megpróbálok venni ramot, aztán meglátom.

    Linux alatt... az más, ott a nyers erővel dolgozik a gép, de nekem az nem jó mert windows-os programokat is irok.

    -Domel

    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 work

    mindegyiké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

    Üdv!
    Csináltam egy programot ami elindít egy Service-t, az meg figyel egy internetes text fájlot és csipog ha változás van. Mivel a MainActivity nem lényeg, a programot ki is lövöm(telefon alkalmazás-választó menüből), ekkor a Service újraindul és teszi a dolgát.(1 folyamat 1 szolgáltatásként) Ha a kódba beteszek egy sort

    public int onStartCommand(Intent intent, int flags, int startId) {

    adatnull = intent.getStringExtra("adat0"); // <--- ezt

    akkor valahogy megváltozik az APK szerkezete, és mikor kilövöm az app-ot, nem indul újra a Service. (0 folyamat 1 szolgáltatás lesz, majd egy másodperc múlva bezáródik a Service).

    Kérdéseim:
    -Futhat úgy Service, hogy 0 feladat 1 szolgáltatás?
    -Ha kilövöm a programot, akkor miért indul újra a Service?
    -Ha beteszem azt a bizonyos sort, akkor miért nem? Most akkor melyik a bug?

    Ha én szeretnék egy háttérben futó alkalmazást, amit az alkalmazás-választó menüből is kilőhetek úgy, hogy az továbbra is a háttérben működjön, akkor merre induljak el?

    Üdv! -Domel

    Egy biztos: A google HQ nem úgy alkotta a rendszert, hogy ki kelljen lőni bármit is, ha nincs rá szükség. :Y

    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

    Üdv! Hogyan lehet kikapcsolt (és usb kábelről lehúzott) telefonon pontos időzítést csinálni?

    Thread lessThread = new Thread(r);
    lessThread.start();
    . . .
    public Runnable r = new Runnable() {
    @Override
    public void run() {

    mySound4.start();
    szamlalo = szamlalo + 1;
    if (szamlalo == 60){
    szamlalo = 0;

    new Feldolgoz().execute();
    }

    handler.postDelayed(this, 1000);
    }
    };

    A mySound4.start() -ban egy tizedmásodperces néma hang szól, és ha az nincs ott, akkor minden lesz az, csak nem 60 másodperc (pár másodperc eltérés nem számítana), ha a postDelay-t 60000-re állítom, akkor még a mySound sem számít, 200-300%-os eltérések lesznek a meghívások között.
    Próbáltam mással is, scheduledPool.scheduleWithFixedDelay(r, 1, 1, TimeUnit.SECONDS); ,de a probléma ugyanaz. Mivel lehet még időzíteni?
    A telefonon már korábban "teljesítményre" állítottam az energiagazdálkodást, elvileg az nem lehet hiba, és bekapcsolt telefonnál sincs hiba az időzítéssel.

    Köcce! -Domel

  • 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?

    É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. :C

  • thon73
    tag

    Oké, String ügyben meggyőztetek! :K

    Azt szeretném kérdezni, hogy Service-ben lehetséges egy text fájlot letölteni az internetről? Egy ideje szenvedek vele, úgy vettem észre hogy a Service gyengébb még az UI-nál is a terhelhetőséget illetőleg, még a bevállt

    private class MyTask extends AsyncTask<Void, Void, Void> {

    sem megy :((

    Esetleg lenne egy vállalkozó szellemű köztetek, akit ha megfizetek, megír egy olyan programot, ami Service-ben fél percenként megvizsgál egy interneten lévő text fájlot, és ha változás van, lejátszik egy hangot. A program akkor is működne, ha a programot bezárom, pont úgy ahogy a facebook messenger vagy a Skype (tehát látszólag meg sincs nyitva semmi, mégis megy). Én meg utalok mondjuk a PayPal-en vagy simán bankon keresztül. Én meg az így kapott forráskódból tanulnák, mert egyedül sajnos nagyon nehezen megy.

    Üdv: Domel

    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! :K

    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

    Igazad lehet abban hogy a két string mutatója kavar be, de szerintem ez néha számít, néha nem :F

    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.

    Ja, csakhogy a fordítód okos, és tudja, hogy te két egyforma string konstanst gépeltél be. Csak egyet fog létrehozni, vagyis a memóriában ténylegesen csak EGY "vava" lesz.

  • thon73
    tag

    Igazatok volt a text fájl internetes letöltésében, UI szálon esélytelen, találtam is működő példát, az valahogy async eljárásban tölt le az internetről. Az alábbi kóddal szenvedtem pár órát, egy Delphi-ben ismeretlen problémám volt, mutatom:
    (van egy weboldalon egy counter.txt fájl, amiben a számot egy mozgásérzékelő növel ha változás van, akkor lejátszik egy másodperces hangot a telefon)

    package com.example.csabi.gondolok;

    import android.media.MediaPlayer;
    import android.os.AsyncTask;
    import android.os.Handler;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.TextView;
    import android.widget.Toast;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.Random;

    public class MainActivity extends AppCompatActivity {
    String textResult;
    String egyik;
    String masik;
    MediaPlayer mySound;
    private Handler handler = new Handler();
    Random rand = new Random();

    public Runnable r = new Runnable() {
    @Override
    public void run() {
    TextView mtextview = (TextView) findViewById(R.id.mTextView);
    mtextview.setText(egyik+"---"+masik);

    if (egyik != masik){
    mySound.start();
    masik = egyik;
    }
    new MyTask().execute();
    handler.postDelayed(this,5000);
    }
    };



    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mySound = MediaPlayer.create(this,R.raw.sound3);

    Thread lessThread = new Thread(r);
    lessThread.start();
    }

    public void frissit(View view) {
    }

    public void fressit(View view) {
    }


    private class MyTask extends AsyncTask<Void, Void, Void> {
    //String textResult;
    @Override
    protected Void doInBackground(Void... params) {
    URL textUrl;
    try {
    int n = rand.nextInt(9000);
    textUrl = new URL("http://www.spessart.hu/counter.txt?a="+Integer.toString(n));
    BufferedReader bufferReader
    = new BufferedReader(new InputStreamReader(textUrl.openStream()));
    String StringBuffer;
    String stringText = "";
    while ((StringBuffer = bufferReader.readLine()) != null) {
    stringText += StringBuffer;
    }
    bufferReader.close();
    textResult = stringText;
    } catch (MalformedURLException e) {
    e.printStackTrace();
    textResult = "*";//e.toString();
    } catch (IOException e) {
    e.printStackTrace();
    textResult = "*";//e.toString();
    }
    return null;
    }

    @Override
    protected void onPostExecute(Void result) {
    super.onPostExecute(result);
    egyik = textResult;
    int gz = Integer.parseInt(egyik);
    egyik = Integer.toString(gz);

    }
    }

    }

    Itt a végén
    egyik = textResult;
    int gz = Integer.parseInt(egyik);
    egyik = Integer.toString(gz);
    ha az "egyik = textResult" csak úgy simán, akkor öt másodpercenként pittyeg, hiába látom hogy például
    42---42 akkor is lefut az alábbi kód
    if (egyik != masik){
    mySound.start();
    masik = egyik;
    }
    Ez mitől van? A string tartalmazza a memóriacímet is??? Vagy bug?

    Üdv: Domel

    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

    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 :R

    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 :R

  • thon73
    tag

    Üdv fórumlakók!

    Arra van valakinek tippje, hogy az appcompat libbel érkező stílusokat hogyan lehet úgy használni, hogy azoknak tényleg hasonlítsanak is a különféle api verziók között?

    Pl: style="@style/TextAppearance.AppCompat.Body1" API 23-on úgy néz ki ahogy kell, de API 16-on teljesen más. Body2 egy kicsit bold az új készüléken, de a régebbin meg totálisan más. Van valakinek ebben kompetens válasza?

    Köszönöm!

    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... :F

  • 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

    Sziasztok!

    Van nyárra egy olyan tervem, hogy szeretnék készíteni egy kis android játékot. Egyértelműen nem a grafikán lenne a hangsúly, inkább valami logikai, gondolkodtató a lényeg, hogy ezzel gyakoroljak.
    Van már egy alap tudásom, de hogy egyedül nekiálljak egy ilyen projektnek és minden problémára megoldást találjak az még nem megy, ebben akarok fejlődni.
    Mit ajánlotok, hogy megértsem és magamtól össze tudjak rakni egy ilyen alkalmazást?
    Jöhet angolul, magyarul könyv videó stb. A lényeg, hogy haladjak és gyakorlatot szerezzek.

    Köszi. :R

    Ú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.org

    Aztá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

    Milyen eszközöket használtok a studión kivül a fejlesztéshez?

    AIDE, ha magán a tableten kell/lehet fejleszteni. Kompatibilis az AS-sel (Eclipse-sel is), csak a style szokott rakoncátlankodni.

  • thon73
    tag

    Örülj, ha be tudod tölteni a régi projektedet. Tavaly kedztem nézegetni a droidot, de van, amit nem tudok rendesen betölteni, gradle hibák tömkelege jön. Szerencsére nem fontos munkák, csak példaprogramok, de bosszantó.

    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. :F

  • 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?

    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

    Sziasztok!

    Irtunk par appot es elojott egy olyan hiba, hogy telefon ujrainditasa utan egymas utan kiirjak, hogy ez az app leallt az az app leallt. Mintha hatterben el akarnanak indulni csak nem tudnak. Mi lehet a gond? Bent hagytunk valami beallitast az Android studioban, ami automatikusan elinditja az appot reboot utan? Es egyszerre mind el akar indulni?
    Valami otlet?
    Koszonom.

    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

    Nem vagyok benne biztos, hogy ilyen kis jovedelem utan adoznod kene...

    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

    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.

    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? :F
    Köszönöm, ha elmondjátok a véleményeteket!

  • thon73
    tag

    Köszi!
    A MEDIA_REMOVED fogja azt jelenteni, hogy egyáltalán nincs sd kártya, a MEDIA_UNMOUNTED pedig ha előkészítés alatt áll?

  • 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

    Dependency graph-ot akarsz? Az Analyze menupontban vannak erre opciok.

    :R :R :R
    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

    1. Jobb gomb -> Find usages ?

    2. Bookmarks?

    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:
    :F 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.
    :F 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

    "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 :P 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.

    Karma, abszolúte megérdemled a Mikulás-sipkát! Csodásan működik, és ezt az egész részt csak pár perc volt beletenni. Én meg ezt olvasgattam már napok óta. Hála és köszönet! És Boldog Karácsonyt! :C

  • thon73
    tag

    "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 :P 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.

    Nagy-nagy köszönöm! :R :R :R
    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

    Az összes felsorolt alternatíva háttérszállal dolgozik, amire nincs szükséged. A Handler.postDelayed a legjobb és legtisztább megoldás.

    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! :R :R

    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

    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

    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!

    :W Ezekbe a hibákba mindig csak én futok bele!? :W

    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. :R

  • 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

    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
    :(

    Csak megerősítem, mert sokat játszottam vele. Tényleg egyszerűbb.
    Nézd a jó oldalát: a saját magad által gyártott src részhez legalább nem kell hozzányúlni...
    DE: minden régi és leporolandó projekttel el kell ezt játszani.

  • thon73
    tag

    Van arra valamilyen elfogadott (vagy legalább bevált) megoldás, hogy, ha máshonnan áthozok egy projectet (android studioban készült mindkettő), akkor a build.gradle ne f***a össze magát?
    Konkrétan arról van szó, hogy pár hónapig használtam a win10-t, és közben használtam az AS-t is. 1.3, 1.4 verziókat, aszthiszem. Most, a rendes gépemet frissítettem Win7-ről win10-re, és a régi, próbakonfigon lévő projektjeimet szeretném megnyitni. De már a MyApplication1 is összeborul.
    A mostani windows telepítés wadonatúj, új benne a JDK7-es, Az AS is vadiújan lett telepítve, és alá az SDK-k is. Felraktam a 6-os SDK-t, és még a 4.2.2-t.
    Kókányoláson kívül máshogy meg lehet oldani a dolgot? Most ilyen marhaságokkal bosszant az AS
    "Error:(19, 0) Gradle DSL method not found: 'android()'
    Possible causes:<ul><li>The project 'MyApplication2' may be using a version of Gradle that does not contain the method.
    <a href="open.wrapper.file">Open Gradle wrapper file</a></li><li>The build file may be missing a Gradle plugin.
    <a href="apply.gradle.plugin">Apply Gradle plugin</a></li>"

    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

    Egyébként a File menüben a Project Structure alatt próbáltad már a jó JDK-t beállítani? Ezt a kulcs momentumot nem láttam a hozzászólásokban. Ja és a .idea mappát elimináld a source control alól, sok szívást spórolhatsz vele :)

    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

    É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.

    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. :F

  • 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!

    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

    Ha jól tudom akkor párszor ki kell nyomni az ablakot, aztán menüből Check update vagy mi a neve és 3-4x próbálkozás után már látja rendesen. Nekem Linux alatt is problémázott már. Ismert hiba.

    Köszi, akkor játszom vele. Én még nem ismertem ... de nem lett volna humorom az egészet újratelepíteni. :Y

  • 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

    Ez most valami Drag & drop dolog akar lenni?

    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

    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.))

    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

    Erre sajnos nincs lehetőség, a rendszer nem küld külön Intentet ebben a pillanatban a hívás állapotot figyelő alkalmazásoknak. Hogy a gyártók mit csinálnak a saját RIL-jükkel, az más - és sajnos irreleváns - kérdés.

    É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

    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 lehet

    A 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!

    :B :B
    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 lehet

    A 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

    Én úgy szoktam, ha a savedInstace null, akkor csinálok újat. Egyéb esetben a manager magától helyreállítja a dolgokat.

    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

    Sztem erre az ultimate megoldas a projekt-be becommitolni a keystore file, majd beallatni a buildscript-ben, hogy azt hasznalja. Igy teljesen portolhato lesz a projekt.

    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

    Nem kell azt egyáltalán szájbarágni és semmi köze a Studióhoz. A gépeden a felhasználód home mappájában (pl. Windowson \Users\valami, Linuxon /home/valami) van egy .android könyvtár, az ebben található debug.keystore fájlt kell lemásolnod a többi gépre.

    :R :R :R
    Köszönöm! Ennél egyszerűbb és kézzelfoghatóbb tanácsot még nem kaptam. Ez pont tökéletes.

    Csak azt nem értem mi a nyavalyának írnak erről oldalnyi érthetetlen litániákat??

  • 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

    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. :F

    Vagy ahogy korábban csináltam, a Service is nézi a preferences változását...

    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

    Bizony, alapesetben újrapéldányosítja már ennyitől is. A Service-ek ennél azért valamivel hosszabb életűek.

    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. :F

    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

    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ó.

    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

    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?

    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

    Ez így van. De azért az se mindegy, hogy például a FragmentPagerAdapter is v4 support Fragmentekkel dolgozik, és nincs 4.x-es verziója.

    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

    ProTip: Aki esetleg használ Loadert, az figyeljen oda, hogy Fragmenten belük ne getLoaderManager()-t hívjon, hanem getActivity().getSupportLoaderManager()-t. Egy jó fél órás fejvakarás eredményeképpen találtam rá. Pedig a Studio lehetne annyira figyelmes, hogy szól erről az apróságról. (Mert ugyebár maga a Fragment is support libes)

    Köszönöm a figyelmet!

    Lehet, hogy nagyon newbie a kérdésem:
    Erre ugye csak akkor van szükség, ha alacsonyabb a minimum-api? (mint a support-ban megadott)?
    Tehát, mondjuk Android 4.x feletti fejlesztésnél ugye nem? (Mármint ha csak 4.x feletti készüléket célzok - legyen API16 - akkor nem?)

  • 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