Új hozzászólás Aktív témák
-
Kutyauto
csendes tag
Sziasztok,
Android Studioban próbálkozom egy alap tanfolyam után. Egyszerűbb kis appok már mennek.
Pályamódosításként kezdtem bele, de már látom hogy valószínűleg csak hobbi marad... azért csinálom, amikor szórakoztat, hátha lesz valami.
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 például az emulátoron átállított nyelv, meg ilyesmi mindig elvész és az már macerásabb. Valamit nem jól csinálok, vagy hogy lehetne ezt elkerülni? (általában csak hibernálom a gépet amikor nem használom, de úgy vettem észre mindegy neki ha rendesen leállítom is.)[ Szerkesztve ]
-
Kutyauto
csendes tag
Hát jó eddig nem lett. Azt vettem észre, hogy amikor elsőre nem bírom elindítani olyankor beragad a memóriába egy emulator.exe meg egy emulator64-crash-service.exe és egy qemu-system-x86_64.exe nevű program. Ha azokat mind kilövöm, akkor következő manuális indításra elindul rendesen.
-
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 ]
-
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... -
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... -
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 ? -
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...
-
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. :-/
-
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 ]
-
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. -
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? -
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
************************************************* -
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 -
Kutyauto
csendes tag
Sziasztok,
Felküzdöttem magam a Playbe , belső tesztelést csinálok egyelőre. Elég összetett dolog a megjelenés, sok mindent nem értek még belőle tisztán.
Gondoltam csinálok egy funkciót, ami időnként lefut hogy az ember tudjon értékelést küldeni az applikációból. Az első tesztnél le is futott, de soha többet.
Aztán olvastam valahol, hogy ha már adott az illető értékelést, akkor többé nem jön az ablak hiába hívogatod. Amúgy is csak központilag szabályozva, olykor olykor fog megjelenni a hívásra.
Max új csomagnévvel megint feltöltve meg ilyesmi, de olyat nem akarnék, nem olyan egyszerű móka...
Kár, hogy nem debuggoltam le elsőre, így most nem tudom miből lehetne tudni, hogy adott, vagy nem adott értékelést az ablakban, ha az megjelent. Mert akkor letárolnám és nem is hívogatnám többet ezt a funkciót.
Ezt az alábbi kódot találtam és építettem be, de nem találok rá infót, hogy az akciót hogyan lehet megtudni :
val reviewManager = ReviewManagerFactory.create(mycontext)
reviewManager.requestReviewFlow()
.addOnCompleteListener { task ->
if (task.isSuccessful) {
reviewManager.launchReviewFlow(mycontext as MainActivity, task.result)
.addOnCompleteListener {
// Continue the normal user flow.
}
}
else {
// Continue the normal user flow.
}
}
Talán ha így hívnám meg:
val result = manager.launchReviewFlow(currentActivity, task.getResult())..addOnCompleteListener {}
Akkor a resultban talán lenne valami eredmény, de nem tudom mi lenne ott és most már kipróbálni sem tudom egyszerű módon... -
Kutyauto
csendes tag
Sziasztok,
Küzdök a publikálással. A legelső feltöltésemben nem talált piros hibát a Google Play, de pár kontraszt, meg efféle dolgokat kiírt. Erre letiltottam a sötét módot, nem volt kedvem vacakolni vele, meg még ezt azt módosítottam. Második feltöltésre , hozott egy hibát egyetlen eszközön, ami a szövegfelolvasás részben keletkezett. (amihez amúgy nem nyúltam)
Itt a lokalizációnak megfelelő első hangot próbálom kiválasztani, amihez nem kell hálózati kapcsolat sem.
var voice:Voice? = null
voice = tts?.voices?.first {
it.locale == clocale && !it.isNetworkConnectionRequired
}
if (voice != null) {
tts?.setVoice(voice)
}
Erre jön ez a hiba, valahol a TextToSpeech motorban :
java.util.NoSuchElementException: Collection contains no element matching the predicate.
Erre az egészet betettem egy
try{ }blokkba, gondolván hogy ha azon belül hiba jön, akkor az ignorálódik. De nem. Megmaradt a hiba .
Elég tanácstalan vagyok, lassan haljok rá, hogy az egészet kihagyom aztán maradjon a defaulton :-/
Amilyen okosnak és kukacosan precíznek tűnik a fordító, pont olyan nehézkesnek megfelelni a teszteken. Még valami egyedi natív crash is van egy fajta eszközön egy szimpla hangfájl lejátszásnál, de azzal még nem foglalkoztam. Kicsit lelomboz ez. -
Kutyauto
csendes tag
válasz Kutyauto #5502 üzenetére
A tts-t defaulton hagyom, nem tudok mit kezdeni vele. Közben rájöttem, hogy a médiával kapcsolatban probléma, hogy timereket használok, azokból indítok effekteket és ha az activityt kilövöm a timer alatt, akkor az hibát okoz, illetve már rég nincs fent az ablak, amikor a tiktakk még mindig megy. Ezeket megoldottam az onDestroy - okban, előbb kilövöm az esetlegesen futó timert.
-
Kutyauto
csendes tag
Köszi, nézem azt is, de még nem volt jó megoldás.
Most végül ezt a formulát (amit amúgy egy csomó ideig keresgéltem):
voice = tts?.voices?.first {
it.locale == clocale && !it.isNetworkConnectionRequired
}
Kicseréltem egy szimpla mechanikus for ciklus - break megoldásra, aztán úgy néz ki így jó. -
Kutyauto
csendes tag
Amúgy megfaragtam ezt a cuccot, működik, de látom hogy nem az lett volna a helyes technika,ahogy csináltam. Volt szó a coroutinokról, de csak alap szinten. Látom, hogy sokkal fontosabb használni és sokkal nagyobb téma. Néztem, hallgattam róla mélyebb anyagokat de gyenge az angolom. Sok próba, debug, tesztelés vár még rám mire megértem azt a sok mindent amiről szó volt ezekben az anyagokban. Ha esetleg valaki tud ingyenes, vagy nem drága magyar nyelvű anyagot erről a témáról azt megköszönném.
-
Kutyauto
csendes tag
Köszi, megnézem ezeket is.
Átrágtam magam ezen : https://amitshekhar.me/blog/kotlin-coroutines és némileg úgy érzem világosodik a dolog. Annyira tán mégsem bonyolult ez, csak régen mintha jobb lett volna a felfogásom .
Az Ekler Péter egy respektábilis személyiség, jók a tanfolyamai, semmi esélyem nem lett volna nélkülük elindulni ebben a dologban. Azonban amíg nem keresek ezzel pénzt (és elég valószínűtlennek tűnik, hogy valaha is fogok...), addig sajna nem tudok már költeni rá több papírnyi összegeket, még akkor sem, ha amúgy megérné az árát. Hobbiként már csakis olyan dolgokat csinálok amik nem kerülnek látható pénzbe. Régebben csináltam fából is dolgokat csak úgy szórakozásként is, de ma már azt is csak akkor csinálom meg ha vagy nekem kell, vagy van aki kifizeti a gépkopást, áramot, anyagokat, a ráfordított időt...hónapokig is csend van a műhelyben. Egyelőre marad az internet, meg a fordítgatás. :-/ . Azért így is szórakoztat, meg ott van a lottó faktor is... hátha valahogy mégis kisül belőle valami. -
Kutyauto
csendes tag
Sziasztok,
Sok helyről hallom, hogy a Jetpack Compose a jövő... Én egyelőre még az xml-es desingt is csak tanulgatom, de azért picit belenéztem pár bemutató videóba. Mindegyikben kézzel írogatnak a kódba megjelenítendő képernyő elemeket, meg hozzájuk paramétereket.
Azok alapján amit eddig láttam egyelőre nem értem mi a királyság a Jetpack Compose-ban az Android Studio grafikus képernyő fejlesztői felületéhez képest. Én sem egyszerűbbnek , sem áttekintetőbbnek nem látom. Nem veszek észre valamit? Ti használjátok a Compose-t? -
Kutyauto
csendes tag
válasz Kutyauto #5513 üzenetére
Ebből kiderült, hogy kb. miért volna ez jó, bár a végeredmény szempontjából azt hiszem végül is mindegy melyik úton éred el ugyanazt a működést. Az is kiderült, hogy ez önmagában is megint egy jó nagy falat, viszont ha a világ erre megy, akkor hosszabb távon nem érdemes lemaradni róla. Azt hiszem egyelőre jobb, ha a hagyományos módszerben lévő gyakorlatot próbálom fejleszteni, aztán egy adott ponton apró lépésben hozzá próbálni ezt az újat.
-
Kutyauto
csendes tag
Sajnos nem emlékszem hogy volt akkor az űrlap amikor csináltam
Nekem az igazolványokat kellett többször elküldenem, vagy mert apró becsillanás volt a fotón, vagy a felbontást kicsinyellték. (olvashatók voltak, gondolom automata dobta vissza) Lényegében majd egy hónap volt a fizetés után mire élni kezdett. Miket kötelező megadnod? Ha beírod a neved és a sima adóazonosító számodat, azt nem eszi? -
Kutyauto
csendes tag
Sziasztok
okhttp cuccal csinálom hogy tudjanak kommunikálni az appok egymással egy szerveren keresztül. Secure winsock a megoldás, az ugye teljesen aszinkron.
A konnektnél azon vakarózom, hogy amikor rányom a konnektálásra és elmegy a request , akkor ugye az adott kiszolgáló vagy válaszol és akkor annak megfelelően a kliens WebsocketListenerjének az onMessage-ben kezelem a dolgot.
De az is lehet, hogy nem válaszol egyáltalán mert mondjuk nem fut.
Ilyenkor ugyanott az onFailure fut le. Ez nálam most ilyen...override fun onFailure(pwebSocket: WebSocket , t: Throwable, response: Response?) {
//Log.d(TAG, "onFailure: ${t.message} $response")
if (t.message?.startsWith("failed to connect to",true)==true) {
if (webSocket?.pnAttempt!! < 3)
{
webSocket?.pnAttempt = webSocket?.pnAttempt!! +1
webSocket?.ws_connect() // újra próbálkozik, a pnAttemptből látja hányadikszor
}
else
{
webSocket?.pnAttempt=1
webSocket?.SocketViewModel?._socketStatus?.postValue(false)
}
}
super.onFailure(pwebSocket, t, response)
}
Azt akarom belőle kihozni, hogy N próbálkozásig hívja újra és újra a konnektet. Ilyenkor a ws_connect -ben van lehetőség másik szervert választani egy listából, vagy ha elfogytak a lehetőségek, akkor vége és a státuszt Próbálkozásból Disconnectre állítom a képernyőn.Ez működik is, csak a kérdés: az onFailure response paramétere ilyenkor üres, a t: Throwable paraméter t.message tagjából tudom kitalálni, hogy konnekt hiba volt.
(t.message?.startsWith("failed to connect to",true)==true)Nincs ez helyett a szöveg helyett valami egzaktabb hibakód valahol? Már mindent széttúrtam, de én nem találtam jobbat.
Kicsit tartok tőle, hogy a szöveges érték esetleg megváltozik valamilyen környezetben és akkor elhasal.
[ Szerkesztve ]
-
Kutyauto
csendes tag
válasz bucihost #5548 üzenetére
Gondolom akkor megreklamálod a dolgot... ? Szerintem ezeket automatán csinálják,
az is lehet, hogy egyszerűen csak a leírást nem találja elég jónak épp valami új algoritmus és valójában köze nincs semmilyen linknek az egészhez, hiába írkál ilyesmit.
Megérte egyébként fent lenni ? Elérted amit gondoltál letöltések számában, reklámban ilyesmiben?
Új hozzászólás Aktív témák
- Anglia - élmények, tapasztalatok
- Konzolokról KULTURÁLT módon
- BestBuy ruhás topik
- Milyen billentyűzetet vegyek?
- 3D nyomtatás
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Kihívás a középkategóriában: teszten a Radeon RX 7600 XT
- NVIDIA GeForce RTX 4080 /4080S / 4090 (AD103 / 102)
- Microsoft Excel topic
- Fujifilm X
- További aktív témák...
- 1151 V2 CPU-k / I5-8500 / I5-8400 / BESZÁMÍTOK!
- Intel i5-10400 hatmagos processzor + doboz + gyári új hűtő
- Nintendo Switch játékok (ง '-' )ง Budapest Nyugatinál
- Fekete Sony PlayStation 5 Cover (Lemezes változat)
- Samsung Galaxy S23 Ultra 5G 256GB Dual SIM Phantom Black Gyárilag független Csere/beszámítás is!