Új hozzászólás Aktív témák
-
Kutyauto
csendes tag
Most épp egy játékot csinálok, amiben vannak animációk, timeres dolgok is. Egy-egy lépés után le kéne fussanak a dolgok és mindaddig nem kéne szabad legyen bele kattintani a képernyőbe.
Evvel szívok, próbálom változóval megoldani no de mindenhová ifeket írni elég macerás. És még csak nem is nagyon működik, folyton összeakadnak a rutinok egymással. Nem találtam olyat, amivel egy lépésben tiltani tudnám az interakciót. Marha szokatlan nekem ez a többszálú működés. Sokat Foxproztam, ott szépen egymás után futottak a dolgok, meg kellett szenvedni ha nem úgy akartad. Itt meg fordítva...[ Szerkesztve ]
-
thiclyoon
aktív tag
-
Kutyauto
csendes tag
válasz thiclyoon #5454 üzenetére
Hát én tényleg csak kezdő vagyok ebben a rendszerben, nem egy mutatni való minőségű kód ez. Mindent kipróbálok ami szembe jön, aztán ha már megtaláltam, kitököltem akkor sem törlöm ki ha mégsem akarom használni, csak kikommentelem. (Mint pittyegés, wav lejátszás, rezegtetés meg effélék) Szóval katyvasz még.
A lényeg, hogy van egy fragmentem, abban egy frame layout.
Ebbe a layoutba futás idő alatt kóddal helyezek el egy csomó egyforma ImageView objektumot. A végeredmény úgy néz ki kb. mint egy sakk tábla.
Minden ImageView ugyanazt a timer kódot futtatja kattintáskor. Mindenféle kiértékelések , és akár hat elemen is animációk futtatódnak. Ennek mind le kéne mennie és a köv. kattintásnak csak ezek után kéne lehetővé válnia. Leegyszerűsítve, áttekinthetősítve ilyen volna:var Clickable:Int = 1 // segéd változó ez jelzi, hogy kattinthatók-e éppen az elemek.
var AnimCount = 0 // segéd változó amiből az utoljára befejeződő animációnak látnia kéne, // hogy a Clickable-t neki kell visszaállítania 1-re.
var ViewList: MutableList<View> = mutableListOf<View>()
// segéd lista amit kezelgetek - a gépi válaszlépés használja.
var GuestTheNext:Int =1 //ki lép következőre ?/*ImageView click kód*/
ImageView.onClickListener{
if (Clickable==1){
onClick()
} // onClickListener vége
}fun onClick()
{
Clickable = 0
/* itt vannak még egyéb dolgok, változókat állítok, képeket cserélek vezérléseken, ilyesmik*/
click_timer.start() // itt indulna egy timer, ami kis időt ad a usernek érzékelni a képernyőn //történt változást, majd értékel és visszaállítja a képernyőt várva a köv. //lépést.
}
/*ImageView click kód vége*/
/* timer kód*/
val click_timer = object : CountDownTimer(500, 500) {
override fun onTick(millisUntilFinished: Long) {}
override fun onFinish() {
/*animáció meghívása két adott objektumra*/
Remanim(ActiveView1)
Remanim(ActiveView2)
/* ... itt egy csomó egyéb művelet, elágazás stb.*/
/*animáció meghívása további objektumokra*/
Remanim(fw_binding!!.imageViewB)
Remanim(fw_binding!!.imageViewC)
Remanim(fw_binding!!.imageViewJ)
} //OnFinish vége
} /*timer kód vége*//*Az animáció*/
fun Remanim(view: View) {
view.animate()
.setDuration(500)
.rotation(360f)
.translationY(0f)
.alpha(0.0f)
.setListener(object : AnimatorListenerAdapter() {
override fun onAnimationStart(animation: Animator?) {
super.onAnimationStart(animation)
AnimCount++
}
override fun onAnimationEnd(animation: Animator) {
super.onAnimationEnd(animation)
/* itt vannak még dolgok, pontszám kiírása ilyesmik*/
if (AnimCount <= 1) {Clickable = 1}
AnimCount--
view.visibility = View.INVISIBLE
ViewList.remove(view)
if (GuestTheNext == 1) GuestTheNext= 0 else GuestTheNext= 1 //játékost cserél
if (GuestTheNext==1){
guest_timer.start() // itt hívódna a vendég játékos, illetve a gépi válasz lépése. tulképp ő is az // onClick() függvényt fogja hívni, csak másik View paraméterrel.
}
}
})
Lényegében a változókkal variálás nélkül simán szét lehet kattintani a képernyőt míg a timer meg az animációk futnak. Végső soron ezzel a variálással sem tökéletes.
Ha elég vadul tapizom a képernyőt akkor szétesik a kód, kétszer egymás után is ugyanaz a játékos tud lépni. -
Kutyauto
csendes tag
Egyébként más is küzd ilyennel, ez itt erről szól :
https://stackoverflow.com/questions/10987633/disable-all-touch-screen-interactions-while-animation
De igazából nem így kéne megoldani, hanem ráérezni ennek a többszálúságnak a lényegére és úgy szervezni a kódot, hogy jó legyen.
Gondoltam aztán, hogy csinálok saját osztályt a FrameLayout ból aminek csinálok setClickableAll(mode:Int) metódust ami minden elemre beállítja amit paraméterbe kap ilyesmi ciklussal... de a programból hozzáadott elemeket nem találtam meg a getChildCount()-tal... mintha nem is volnának.
for (int i = 1, i < layout.getChildCount(), i++) {
TableRow row = (TableRow) layout.getChildAt(i)
row.setClickable(false)
}
No, szóval küzdök mint malac a jégen... Ilyen hosszadalmas és kevéssé egzakt problémákkal nem terhelnélek titeket, de ha lesz könnyen azonosítható kérdésem, akkor mindenképp megjelenek vele... -
thiclyoon
aktív tag
válasz Kutyauto #5455 üzenetére
Ha minden igaz, a
GuestTheNext: Int
a játék állapota. Én áttérnékenum
használatára (bár azInt
tel is megoldható minden, csak szebb, könnyebb lenne előbbivel - ha nem ismered, nem gond, maradhat, ahogy van), és 4 állapotot hoznék létre: egyik lép, másik lép (ez megvolt nálad is 0 és 1 értékekkel), egyik fog jönni (az animáció után), másik fog jönni (az animáció után)(Nem tudom így mennyire világos, majd írok pszeudokódot ha úgy van. A koncepció az, hogy nem a tappolhatóságot állítod, hanem állapotokkal modellezel; amint tappolt a user, átállítod olyanra, hogy ne érdekeljen, ha tappol)
[ Szerkesztve ]
-
Kutyauto
csendes tag
-
Kutyauto
csendes tag
válasz thiclyoon #5457 üzenetére
Van anyagom az enumra, volt róla szó de nekem újdonság, nem is jutott eszembe.
Most az a szituáció, hogy ugyanazon a gépen játszom. Nincs élő partner, a gép lép egy timerrel, aztán megint én. A gép lépése után ugyanúgy elindulnak az animációk amikor olyan a szitu. És én úgy veszem észre, hogy ha egymás után elindítok 6 db animációt akkor sosem fogom tudni hogy melyik ért véget utoljára, hogy az kapcsolja majd vissza a lépés lehetőségét.(ezt próbáltam áthidalni az AnimCount változóval) Ráadásul úgy veszem észre ha az AnimationEnd metódusban visszaállítom a lépés lehetőségét (Clickable=1 ), majd rögtön köv. sorban eltüntetem (Invisible) a kiesett ImageView-t... hiába... már rég le van futva a két sor, mikor (ha elég gyors vagyok) még mindig rá tudok bökni az elemre amire már nem volna szabad tudnom rábökni. Vagy elvétek valami sorrendet, logikát, vagy ez ilyen... nem tudom.
Lényegében most megoldottam hibátlanra egy plusz timer beépítésével és túl is gondolom bizonyos szempontból, hiszen ha hálózaton másik játékossal fog menni a játék (amit célom lesz beépíteni NodeJS alapon) akkor bőven lesz idő mindennek lefutnia míg a kommunikáció lezajlik.
Amúgy is minden nap ezer dolog merül fel amibe belebotlok és nem értem de meg kell tanulnom hogy így van és kész.
pl. van a gombnak strikeColor meg strikeWidth tulajdonsága amit az xml-ben be tudok állítani de futásidőben már nem érhetők el. Vagy hogy használni tudom a setBackColor függvényt, de lekérdezni a gomb aktuális színét csak egy külön furmánykodással lehet. Persze ezt a furmánykodást beépíthetném egy saját funkcióba, ilyenekből épül aztán az embernek egy saját függvénykönyvtára és kész.
Apropó, az pl. nem lett kibeszélve a tanfolyamon, hogyan épül fel ideális esetben egy ilyen rendszer. Saját, több külön projektben újra és újra felhasználni tervezett osztályokat, funkciókat hová kell tenni? Hogy ugyanúgy lehessen aztán behúzni őket egy új projektbe saját gépről, mint a többi függőségeket.
Vágom a fát szorgosan, de nem látok a szálló forgácstól... -
thiclyoon
aktív tag
válasz Kutyauto #5459 üzenetére
Saját, több külön projektben újra és újra felhasználni tervezett osztályokat, funkciókat hová kell tenni?
Meg is válaszoltad ha ugyanúgy akarod őket behúzni, mint más függőségeket, akkor pontosan ugyanúgy kell őket kezelned. De amúgy valahogy úgy néz ki ez a legtöbb esetben, hogy ha organikusan növi ki magát, akkor
- elkezded észrevenni az ismétlődéseket, újrahasználható részeket (ezzel meg is vagy),
- ezeket összeszeded, bővítgeted, és projektenként testreszabod. Itt még általában csak egy fájlhalmazról beszélünk, amiket manuálisan behúzol a projektekbe. Érdemes több projektben kipróbálni őket, hogy 1, hasznosak-e annyira, hogy tényleg ki kell őket szervezni és 2, a hibák jobban előjöjjenek -> érdemes lehet teszteket is írni, ha olyan kódról van szó,
- a fájlhalmaz bővülésével jöhet a gondolat, hogy ha már nem 2 függvényről van szó, akkor érdemes lenne verziókezelni -> összeszeded a dolgokat, és
- publikálod a kódot. Erre van sok leírás, például ez jónak tűnik. Elsőre bonyolultnak tűnhet, de nem nehéz; GitHub kell hozzá és ennyi igazából[ Szerkesztve ]
-
Kutyauto
csendes tag
Tudja valaki hogyan lehet emulálni a mobil megrázását (shake) az emulátoron ?
CTRL+M kombinációt olvastam, de nekem a CTRL csak két pöttyöt pakol fel a képernyőre, azokat sem tudtam megfejteni mire volnának valók, de rázást nem sikerült előállítani sehogy. -
Kutyauto
csendes tag
Sziasztok,
BÚÉK mindenkinek!
Van az a dolog, hogy ha nem tiltom le a képernyő forgatást, akkor újraindul az egész cucc a forgatás után és elveszik az alkalmazás teljes állapota.
Egyelőre a fix orientációt használom, de kísérleteztem használni az "onSaveInstanceState"-et meg a párját...
Szimpla kulcs-érték párok mennek azzal nincs is baj, de van nekem egy rakás másféle objektumom is amiket meg kéne tartani.
Mint például egy ilyen
var MatrixDraw = mutableListOf<MyImageView>()
változót, amiben van egy lista spéci ImageView objektumokból, saját beállított propertykkel meg ilyesmi.
Az ilyenek kimentésére-visszatöltésére nem találtam működő megoldást sehol.
Nem tudtok olyasmi megoldást, aminek csak megadom a kulcsot, meg az értéket, aztán ő elvacakol a megfelelő metódus kiválasztásával, konvertál típust ha kell.... szóval megoldja a kimentést, visszatöltést bármire amit a memóriában találok ? -
thiclyoon
aktív tag
válasz Kutyauto #5465 üzenetére
TL;DR: singleton viewmodel.
Igen, tudom, hogy ez antipattern - viszont egyetemen is ezt tanítják (nem mintha ez érv lenne persze...). Androidon jelenleg nincs jobb / szebb megoldás erre (tudtommal / tanáraim tudtával) - a saveinstancestate nem erre van -, úgyhogy sajnos ezzel kell menni. De ha valaki járatosabb a témában, ne tartsa magában és persze nagyon könnyű rosszul használni, lásd például ezt (ez pont nem android, de a lényeg ugyanaz)
-
bandi0000
nagyúr
válasz thiclyoon #5466 üzenetére
Miért kellene singleton viewModel? Az pont arra van, hogy config változás esetén, mint az elforgatás, megtartja az àllapotát
Önmagában nem is ajánlott singletont csinàlni a viewModelből, nàlunk egy bug volt miatta, mert az app bezárása esetén megmaradt a memóriában, viszont a lifecycle cuccok meg nem indultak újra
Xbox One: bandymnc
-
thiclyoon
aktív tag
válasz bandi0000 #5467 üzenetére
Erre vonatkozott a kérdése: "újraindul az egész cucc a forgatás után és elveszik az alkalmazás teljes állapota", "szóval megoldja a kimentést, visszatöltést bármire amit a memóriában találok"
Persze hogy nem ajánlott, szó szerint ezzel kezdtem a válasz kifejtését#5468 fatal: én nem vitatkozom ezzel az állítással, elég volt a tanároktól meghallgatni
[ Szerkesztve ]
-
Kutyauto
csendes tag
válasz thiclyoon #5466 üzenetére
Köszi, a viewModel lesz a jó kulcsszó. Tanultam az Activity életciklusokról és a saveInstanceState-ről, de nem emlékszem hogy a viewModelről lett volna szó. Persze nem kizárt, de nem emlékszem rá. A tanfolyam harmadik részét nem vettem meg, ott egész biztos előkerült volna. De mindegy, ennyi már elég, holnap majd utánaolvasok.
-
Kutyauto
csendes tag
válasz Kutyauto #5441 üzenetére
"...A kérdés: A benne lévő AVD emulátort használom. Sajna szinte minden nap törölni kell és újra kell telepíteni , mert megdöglik, nem tud elindulni. Jó, hogy pár kattintás, de..."
Evvel kapcsolatban megírnám csak a rögzítés kedvéért, hogy mióta ( 8-10 napja talán ) átállítottam az emulátort arra, hogy teljesen külön ablakban induljon és fusson, azóta a fenti probléma nem fordult elő. -
Kutyauto
csendes tag
Sziasztok,
Már megint összerúgja a bokámat ez a többszálas korutinos dolog...
van a MainActivity aminek az OnCreate- jében akarok csinálni számos Room adatbázissal kapcsolatos dolgot. Egy része megy, amiknek a befejezésére nem kell várnom. (létrehozás, feltöltés csv fájlból default értékekkel stb...)
Viszont például kiolvasni már tárolt értékeket adatbázisból és UTÁNA azoknak megfelelően futtatni tovább az onCreate-t .... ez nem sikerül.
Mivel az async().await csak suspend függvényben működik, az onCreate meg nem engedi magát suspend deklarálni.Csűrtem és csavartam mindenfelé, de elakadtam vele...
-
bandi0000
nagyúr
válasz Kutyauto #5473 üzenetére
Húha, itt azért elég sok alap dolog hiányzik...
Egyrészt ezt úgy szokás, hogy pl ha màr van viewModelled, akkor ott a mentésre hasznàlod a viewModelScope-ot, amivel ki tudsz menni az IO szálra, és ott elvégrzni a szükséges műveleteket
Visszatöltés hasonló képpen, de ha már adatbázis, és gondolom Room, akkor kézenfekvő a LiveData vagy Flow hasznàla
Apropó, mihez kell neked az async await ha màr coroutint használsz?
[ Szerkesztve ]
Xbox One: bandymnc
-
Kutyauto
csendes tag
válasz bandi0000 #5474 üzenetére
Hát igazából ez a sor
var setup = AppDatabase.getInstance(mycontext).gradeDao().getsetup()
ami lekérdezné a tárolt beállításokat panaszkodik rá, hogy nem tud ő a fő szálon futni.
Erre aztán kipakoltam egy funkcióba, hogy majd az lekéri és beállítja amit kell.. de persze ezt se tudom hívni onCreate-ből, tehát amúgy sem volna jó.
Az egész földhözragadt sorról-sorra világképemmel van baj.
*****************
import android.util.Log
import com.example.rapidsk.*
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async
suspend fun loadSetup() {
var setup: Setup? = null
val cSql = AppDatabase.getInstance(mycontext)
GlobalScope.async {
try {
var setup = AppDatabase.getInstance(mycontext).gradeDao().getsetup()
} catch (e: Exception) {
Log.e("loadSetup hiba", e.message!!)
}
}.await()
pnSounds=setup.voice
pnBuzz=setup.buzzer
ActualMatrix = setup.matrix
ActualLevel = setup.level
}
********
Pár hete kicsit Node.js -el is foglalkoztam, abban is eljutottam valameddig, az ottani async is bekavarhat. Később majd az volna az elképzelés, hogy MySQL + Node volna középen, a kliensek oldalán meg mennének az Android appok.De most jól összekeveredett a fejemben minden, túl sokféle újdonságot olvastam meg írtam össze túl gyorsan. Talán túl öreg vagyok én már ehhez. :-/
-
bandi0000
nagyúr
válasz Kutyauto #5475 üzenetére
Nem az öregséggel vagy épp fiatalsàggal van a gond, hanem a tudás felépítésével
Kb ezt úgy tudom elképzelni, hogy valaki elolvassa, hogy hogyan kell falat festeni, aztàn ràjön, hogy nincs fal, akkor gyorsan utánanéz, aztán megint gond van, mert nincs vakolás, glettelés stb stb
Most ha minden áron működőképesre akarod kalapálni, akkor az onCreate-ben, csinálj egy ilyen blokkot:
lifecycleScope.launch{
}
És oda rakd be a suspend fv hívásodat
Xbox One: bandymnc
-
Kutyauto
csendes tag
válasz bandi0000 #5476 üzenetére
Hát igen, össze vissza alakulnak ki a dolgok, nem lehet mindig lépésről lépésre haladni.
Sokszor kell visszamenni, átdolgozni,kipróbálni más megoldást is... Korábban is így boldogultam, csak talán egyszerűbb volt az az eszköz, meg nem voltak olyan berögződött elképzeléseim mint most.
Végül kipróbáltam a ViewModeles megoldást is.
Az initjébe betettem a lekérdezést így :
init {
var setup: Setup? = null
try {
viewModelScope.launch(Dispatchers.IO) {
setup = AppDatabase.getInstance(mycontext).gradeDao().getsetup()
if (setup != null) {
this.pnSounds = setup!!.voice
this.pnBuzz = setup!!.buzzer
this.ActualMatrix = setup!!.matrix
this.ActualLevel = setup!!.level
}
}
} catch (e: Exception) {
Log.e("loadSetup hiba", e.message!!)
}
}
És így jó. Így is csak a viewModelScope.launch(Dispatchers.IO) megoldással megy.
A lifecycleScope nem tudom miből jönne (**), nem tudtam beimportolni sehogy. De a scope és launch szavak alapján a
LifecycleCoroutineScope.launch() -ot
meg ezt a
viewModelScope.launch() -ot találtam. Utóbbit választottam, mert nem kért importot és maradt is mert így működik.
(**)
Ezeket az alábbi Gradle sorokat beletettem, de sehogy sem akarta...
def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
Köszi a tippet. -
Kutyauto
csendes tag
válasz bandi0000 #5478 üzenetére
Köszi... No küzdök vele, haladok lassacskán.
Ez az egész abból jön, hogy próbálom megcsinálni azt az indításkori műveletet, amit az egyszálú Foxproban leegyszerűsítve anno valahogy így csináltam...
llRet = true
IF ( Nincs meg a helyén az adatbázis? ) // nem futott még, vagy letörölték, átnevezték...
llRet = Adatbázis létrehozása()
IF (llRet)
llRet = Tábla1 ellenőrzése / létrehozása / feltöltése()
ENDIF
IF (llRet)
llRet = Tábla2 ellenőrzése / létrehozása / feltöltése()
ENDIF
..... és így tovább
ENDIF
IF (llRet)
// futott már és/vagy elvileg kész a háttér
llRet = Adatkörnyezet beállítása ()
ENDIFReturn llRet
... ha itt False , akkor nincs értelme tovább futni, mert előbb utóbb hiányozni fog vmi...Itt nyilván minden egyes sort meg kell várni, mert ha valamelyik bármilyen hibára megy akkor a többit nincs értelme futtatni, elindulni sem lehet. Hát igen, ilyenkor az ember kitett egy szép folyamat jelzőt, az user meg szépen kivárta a végét...
Ezt nekem nagyon nehézkessé teszi kezelni, ha minden egyes adatbázis műveletet külön szálban, vagy launch ban kell indítani és az indító kód fut közben tovább. Szerintem ez is a Node.js tanfolyamon megismert Pyramid of doom vagy Callback hell helyzet, amit ott async - await()-ekkel oldanak fel.
No, ezt próbáltam itt is megérteni és kibogozni, de lehet hogy alapból rossz végén akarom megfogni a kapát... Bocs ha fárasztó vagyok :-) -
Kutyauto
csendes tag
No volna egy hétköznapibb bajom is, talán vkinek ismerős...
Van a Studioban a Tools->Kotlin-> Kotlin REPL nevű eszköz... olyan command line féle
Ez nem indul el nekem, ezt írja:
`CommandLineWrapper` is ill-suited for launching apps on Java 9+.
If the run configuration uses "classpath file", please change it to "@argfile".
Otherwise, please contact support.
Ha a Run->Edit configurations-> Edit config templates menüben a Kotlin és Kotlin Script lapokon az Environment variables mezőbe beírom hogy classpath=@argfile , akkor elindul... de hiába tárolódik el, legközelebb megint ugyanaz a baj ismét be kell lépnem és leokézni hogy elinduljon. Amit lehetett már frissítettem. -
-
Kutyauto
csendes tag
válasz bandi0000 #5481 üzenetére
No igen ez alapból jó ötlet.... azon a szinten amin most bolyongok Androidban.
De később szeretnék tovább lépni MySql felé , illetve Repository-t is használni.
Korábban úgy csináltuk, hogy amikor mondjuk kiadtunk egy új programfájl verziót ami mondjuk adatbázis módosítást is igényelt / tartalmazott, és a felhasználói hálózaton vki megpróbálta lefrissíteni a programját, akkor a progi lefrissült, majd az indulásakor kinézett az SQL-re és ha más nem volt rajta bejelentkezve, akkor megfrissítette az adatbázist is a saját magasabb verziójára és szépen elindult.
A többiek a köv. induláskor persze nem tudtak belépni csak programfrissítés után.
Errefelé gondolkozom most is távlatilag, ezért küzdök ilyesmikkel.
-
Kutyauto
csendes tag
Van egy mutable listám, vannak benne objektumok.
Sorba rendezem a lista.sortBy{it.property} módszerrel, majd végigmennék rajta és végeznék írási műveleteket benne, és eközben egyszer csak elvész a beállított sorrend... ezzel bajlódok épp.
Eleve bajom volt, mert a benne lévő objektumok saját classból vannak és a saját propertyre akartam a sorrendet beállítani. Ez csak úgy működött, ha a classban a propertyt
@JvmField var Property:String =""
módon adtam meg, egyébként kaptam egy Illegal access hibát a sortBy-ra . Ezt kigugliztam, de most meg avval szivat, hogy elvész a beállított sorrend menet közben.Elfáradtam bele, csinálok egy kis fizikai melót...
[ Szerkesztve ]
-
BE4GLE
aktív tag
válasz Kutyauto #5483 üzenetére
Szia! Pár tippet tudok adni. Kerüld a mutable listát és a mutable object-et. Final listával dolgozz, amiben data class-ok vannak kizárólag final property-vel. A sortby az eredeti listádat módosítja. Tehát van mellékhatása. A final list esetében viszont új listát kapsz, ha rendezed. Ha az elemeken valamit változtatnod kell használd a lista map metódusát és a data class copy metódusával módosítsd, amit kell. A mutable collection-öket inkább csak arra használd, hogy elemekkel töltsd fel őket. De de később már ne módosíts rajtuk. Mindig interface típussal térj vissza, sose mutable-lel.
[ Szerkesztve ]
Redmi Note 9 Pro
-
Kutyauto
csendes tag
Köszi a tippeket, utánaolvasok, ki fogom próbálni amiket nem ismerek belőle.
Sok mindennel játszom, kísérletezem amibe belebotlok... igazából csak a tapasztalás, tanulás kedvéért írogatom amiket most csinálok. Érdekes, hogy pár programsorral olyan funkciókat lehet megvalósítani, mint az írott szövegek felolvasása... ugyanakkor például éppen ebben jött elő, hogy ha előkészítem
tts = TextToSpeech(mycontext, ttsListener )
majd a listener initjében szeretném beállítani a default lokációnak megfelelő hangot ...
val voice = tts?.voices?.first { it.locale== Locale.getDefault() && !it.isNetworkConnectionRequired}
if (voice != null) {
tts?.setVoice(voice)
}
Hát a tts.voices egy 389 elemű lista, amelyből nekem csak az a 2-3 elem kell, ami megfelel néhány paraméternek. Ennek a listának a szűrése ( .filter{} ), keresni benne ( .first{} ) elemet a mostani tapasztalatom szerint baromi lassú... egyelőre nem találtam azt a módszert ami ne tűnne nagyon lassúnak.
A másik, hogy intiben beállítom a sebességet (alapból is amúgy is 1 lenne gondolom)
tts?.setSpeechRate(1f)
de ennek ellenére az első néhány megszólalás sokszor nagyon hadarós. Aztán lelassít a beállított normál tempóra. -
Ogard
tag
Évek óta használok egy moov nevű wearable edző rendszert, egy bokán hordható mozgásérzékelő és egy homlokpántba helyezett szívritmusfigyelő keveréke. A neve moov, nagyon pöpec, korát messze megelőzte, nagyon szeretem.
Nemrég telefont cseréltem és ekkor döbbentem rá, hogy a cég megszűnt, vagy legalábbis befejezték az eszközök forgalmazását és támogatását:
https://welcome.moov.cc/notice
a hozzávaló app nincs már fent a playstore-on. Az apkpure-on megtaláltam,
https://apkpure.com/moov-coach-guided-workouts/cc.moov.one/versions
letöltöttem, a szerver még működik, be tudtam logolni és le tudtam tölteni az adataimat is, és program beépülő edzésmoduljai is letöltődtek.
Eddig minden szép és jó, de mi lesz, ha lelövik majd a szervert? Működik-e majd vajon egyáltalán?
Kérdésem, hogy megoldható-e az app moddolása, úgy hogy online komponensek nélkül is működni tudjon, és vajon milyen nagyságrendű munka ez?
Egyáltalán mennyire moddolható forráskód nélkül egy ilyen app?
Nyilván nem azt gondolom, hogy én magam megcsinálnám, de lehet-e egyáltalán ilyen feladatra embert találni? (Nyilván nem ingyen - de kérdés, hogy megéri egyáltalán.)
Egyszer egyébként valaki picit moddolta már, részadatmentés céljából:
https://forum.xda-developers.com/t/app-mod-moov-coach-v5-1-4131.3948505/
de ez csak minimális változás volt.[ Szerkesztve ]
-
sztanozs
veterán
Le kellene sniffelni, hogy kommunikal a szerverrel es akkor lehetne csinalni hozza egy lokalis mock szervert DNS redirection-nel (vagy az apk hackelesevel).
Alternativakepp dekompilalni kell az apk-t es abbol kiturni, hogy hogyan kommunikal.JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
fonixportal
újonc
Sziasztok tudom hogy új vagyok itt de csináltam egy videót arról mi is az én problémám magyarítottam egy androidos játékot és ezzel a játékkal volna egy kis gondom amit magyarítottam nézzétek meg ebből minden érthetővé válik mi is a gondom. Ködzönöm
https://mega.nz/file/1ER1GYTa#INnJk82tD2SRSX_uW8qkOV3sFaaYYC5Oj7mSYo0fJRg
-
sztanozs
veterán
válasz fonixportal #5488 üzenetére
es miert nem YT-ra raktad fel? miert kell filemegosztoval szenvedni?
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
Kutyauto
csendes tag
//Mire az alábbit megírtam, megoldódott.... Rendesen futtatva azért nem ment mert el volt írva a bekérő sor. Debug ablakban meg úgy látszik nem lehet kiértékeltetni ezt a kifejezést....
Sziasztok,
Vajh mi az oka annak, hogy a getString(id) nekem semmilyen formában nem megy?
Se a MainActivity onCreate -ben, se sehol máshol. Bárhol, bármilyen formában próbálom elérni, hibát ad vissza. A legkülönbözőbb elérésekkel, kontextekkel próbáltam. A string azonosítót feladja, aztán mégis az a hiba, hogy nem találja.
Most két sztring resource fájlom van, de default és egy (en) változat, de gondolom nem ez lehet a baj.
Órák óta szívok vele, amiket a neten találtam már próbáltam, de vagy nem is jött nekem elő a javasolt függvény, vagy ha mégis az is ugyanígy nem működött. Fragmentjeim is vannak.[ Szerkesztve ]
-
Kutyauto
csendes tag
Sziasztok,
Első körben lassan elkészül a nagy mű. Utolsó lépésként integrálni szerettem volna bele egy Google AdMob banner formátumot. Elvileg sikerült is, fordul az egész.
Regisztráltam az AdMob -on , felvettem teszt eszköznek a laptopon futó emulátort.
Ettől függetlenül nem akartam a saját AdMob ID-mal tesztelni, hanem a https://admob-plus.github.io/docs/cordova/test-ads oldalon található
ca-app-pub-3940256099942544/6300978111 ID-t tettem bele a Manifestbe és az Activitybe is. Sajna nem indul el, Invalid ID üzenetet kapok rá.
Végül kipróbáltam a saját számommal is, de arra is ez jön. Az talán még amúgy sem aktív, mivel még nem töltöttem fel semmilyen app boltba a progit. Ezt reklámmal együtt való tesztelés után terveztem. Hogyan kéne ennek mennie? -
sztanozs
veterán
válasz Kutyauto #5491 üzenetére
csekk disz: https://stackoverflow.com/questions/53451980/getting-invalid-application-id-error-when-trying-to-implement-admob-in-android
+ https://support.google.com/admob/answer/7356431?hl=en-GB[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
Kutyauto
csendes tag
válasz sztanozs #5492 üzenetére
Köszi. Átnéztem, de végül máshonnét lett jó.
Én is és amennyire látom az általad adott linken kérdező valaki is úgy gondolom/gondoltam,
hogy a Manifest és az XML fájlban ugyanannak az ID számnak kellene szerepelnie, de úgy sehogy nem működik nekem.
A https://developers.google.com/admob/android/quick-start#import_the_mobile_ads_sdk leírás (továbbiak "leírás") alapján, a Manifest fájlban a szintén ott látható Sample AdMob app ID komment sorban megadott értékkel elindul a cucc és akkor jelenik meg hirdetés, ha a megjelenítő xml fálban a fene tudja már hol talált "/6499/example/banner" érték, vagy a leírásban a Banner típus implenetációjára tovább kattintva ott megadott "ca-app-pub-3940256099942544/6300978111" érték szerepel.
Ha egyforma értéket írok akkor vagy el sem indul, vagy elindul de nem jelenik meg a banner.
Szóval igazából most azt hiszem két külön szám kell. A Manifestbe az app id, az xml-be meg a formátumnak megfelelő fix érték. Majd most próbálom cseszegetni, kitalálni mikor és hogyan cserélődik a tartalom, meg megnézni mikor mi hívódik meg rajta.
-
Kutyauto
csendes tag
válasz Kutyauto #5493 üzenetére
Bár megnézve ezt https://support.google.com/admob/answer/3016009?hl=en és ebből átkattintva ide https://support.google.com/admob/answer/7356431
és utána ennek a harmadik pontjából
https://developers.google.com/admob/android/quick-start
átkattintva ide: https://support.google.com/admob/answer/7356431
...ugyanoda jutunk, tehát az első gondolatomnak kellett volna jónak lennie, a két érték egyforma volna... csak úgy nem működik. A tesztelésre feltalált értékek közül csak felemás párosítással működik valahogy...
Megint megfájdult a fejem és belekavarodtam... :-/ pihi. -
Kutyauto
csendes tag
Sziasztok,
No, elvileg készen vagyok egy alap változattal. Van itthon egy 2016 os kisebb felbontású Samsungom, azzal elvacakoltam mire azon is futottak és jól megjelentek a dolgok. Még memória korlátba is ütköztem, egyes funkciókat át kellett írnom. Bár elsősorban tanulási céllal csináltam ezt a konkrét játékot , azért nyilván hasznát is szívesen látnám ha van rá mód.
A jelenlegi változat csak lokálisan működik, ergo ha nincs hálózat akkor reklám sem fut, de játszani azt lehet vele. Hogy lehet ebből legjobban kihozni a pontenciálisan benne lévő 10 dollárt?
Látom pl. , hogy a MobAds nem engedélyez Donate gombot meg ilyesmiket. Van-e olyan platform ahová fel lehet tenni Donate gombos, vagy másképp PayPalos fizetést lehetővé tevő verziót és a mobilok is hajlandók megbízhatóként telepíteni az onnan származó cuccot?
Olvasgatok magam is ebben a témában, de ha van valakinek evvel kapcsolatban tapasztalata az érdekelne. -
Kutyauto
csendes tag
Sziasztok
A MainActivity-men van egy tabLayout aminek 3 lapja van.
Mind a háromba egy -egy xml töltődik, a hozzájuk tartozó Class-ok Fragment() ből vannak.
A második és harmadik lapok felépítése, betöltése teljesen megegyezik, csak a tartalma és a vezérlések kódja más.
Ha az elsőről a második page-re átlépek, majd az elsőre vissza akárhányszor, az első onCreateView-ja sosem fut le újra.
Ha az elsőről a harmadikra lépek át akár egy lépésben, vagy akár a másodikon keresztül, majd vissza az elsőre, akkor az első lap onCreateView-ja azonnal lefut újra.
Nem találom a kódban semmi indokát ennek a különböző viselkedésnek, ahogy látom minden vonatkozó rész tök egyforma felépítésű. Lehet ennek valami befolyásolható oka amit nem látok, vagy véletlenszerű, hogy az időlegesen nem látható első oldalt mikor tölti újra rendszer? Meg tudom kérni valahogy ne csinálja?
-
Kutyauto
csendes tag
válasz Kutyauto #5497 üzenetére
Az első lapon futó kód minden életciklus függvényét kiírattam és néztem a konzolon mi történik : átkattintok az elsőről a második oldalra, majd vissza.... Aztán az elsőről a harmadikra és vissza.
Elsőnél csak az onPause, majd az onResume fut le. Másodiknál van még valami, ami kiváltja az oldal újratöltését is. Át kell írnom ezt az onCreateView-t, hogy mindenképp jó legyen.
*******************************
D/EGL_emulation: app_time_stats: avg=598.44ms min=10.23ms max=6666.20ms count=12I/System.out: TAB1 fragment onPause
I/OpenGLRenderer: Davey! duration=766ms; Flags=0, FrameTimelineVsyncId=192136, IntendedVsync=38222434750298, Vsync=38222868083614, InputEventId=0, HandleInputStart=38222881628520, AnimationStart=38222881673120, PerformTraversalsStart=38222884529220, DrawStart=38223142900020, FrameDeadline=38222468083630, FrameInterval=38222881491520, FrameStartTime=16666666, SyncQueued=38223181721620, SyncStart=38223182247220, IssueDrawCommandsStart=38223183019820, SwapBuffers=38223197923120, FrameCompleted=38223201973620, DequeueBufferDuration=102100, QueueBufferDuration=2548500, GpuCompleted=38223201310720, SwapBuffersCompleted=38223201973620, DisplayPresentTime=8026311069216502372,
D/EGL_emulation: app_time_stats: avg=17.82ms min=5.02ms max=217.56ms count=41
D/EGL_emulation: app_time_stats: avg=772.65ms min=3.85ms max=4551.29ms count=6I/System.out: TAB1 fragment onResume
*************************
Aztán átkattintok az elsőről a harmadikra és vissza... Szintén a pause és a resume fut le , csak közben valamiért még belép a reklám blokk is.. de ha kiszedem az egész bannert, akkor is ugyanez van.
************************************
I/System.out: TAB1 fragment onPause
D/EGL_emulation: app_time_stats: avg=77.93ms min=3.00ms max=3133.50ms count=50
D/DynamitePackage: Instantiating com.google.android.gms.ads.ChimeraAdManagerCreatorImpl
I/Ads: This request is sent from a test device.
W/ConnectionStatusConfig: Dynamic lookup for intent failed for action: com.google.android.gms.ads.service.START
I/System.out: TAB1 fragment onResume
Ez után viszont jön még egy rakás sor, ami az előzőnél szintén nem jött. talán a kiemelt résszel van baja, ami miatt aztán megjön az onCreateView is.
I/Choreographer: Skipped 38 frames! The application may be doing too much work on its main thread.
D/EGL_emulation: app_time_stats: avg=5.34ms min=2.11ms max=30.96ms count=52
I/OpenGLRenderer: Davey! duration=941ms; Flags=0, FrameTimelineVsyncId=192481, IntendedVsync=38239284749624, Vsync=38239918082932, InputEventId=930823484, HandleInputStart=38239921690220, AnimationStart=38239921719020, .... és a többi
************************************************* -
BE4GLE
aktív tag
válasz Kutyauto #5497 üzenetére
Szia! Nem nagyon követtem a projekted alakulását, de első ránézésre egy viewpager-nek tűnik, amit összehoztál. Abban van egy offscreen page limit, amit megváltoztathatsz, ha konzisztens működést szeretnél az oldalaidon. Feltéve, na nem túl komplexek az oldalak. Általában nem jó ötlet mindent a memóriában tartani.
Redmi Note 9 Pro
-
Kutyauto
csendes tag
Üdv,
Köszönöm, ez megoldotta!
Amiket korábban írtál, azoknak is kezdem kapisgálni az értelmét...
Megtapasztaltam mekkora szívás is pl. amikor egy nem classban, hanem primitív változóban tárolt adatot később mégis by reference akarnék passzolgatni (végül találtam rá megoldást),
tovább addig, hogy mennyivel könnyebb is viewModelt, meg livedata-t használni , meg databindinget... meg stílusokat, meg még egy rakás dolgot amiket használni kell sokat mire az alapjaik készséggé válnak.
Óceán van tudnivalókból. Ha kitart a lelkesedésem pár év múlva talán ügyes 60-as junior leszek
Új hozzászólás Aktív témák
- iPhone 15 Pro 128GB FEHÉR TITÁN MAKULÁTLAN
- iPhone 14 128GB Lila Független Mint Az Új/1-3 hónap gar./Akku 92%/p3826
- minigép/ i5 6500T 35W/ Dell 3050 micro/ garancia/ ingyen foxpost
- Új Modell Apple Watch Ultra 2 49mm Black/2025.09.21 Apple Gar./p3825/
- Cisco SG200-50 smart switch - 48+2 portos Gigabites
Állásajánlatok
Cég: HC Pointer Kft.
Város: Pécs
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest