• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    LWEEKAndroid development
    JOHNY_G
    JOHNY_G --- ---
    DATEL: Camera API je paskvil, a proto mají všichni výrobci proprietární foťák a všechny ostatní aplikace fotí hnusně :-)). Jestli můžeš, použij prostě camera picker. Jestli nemůžeš, budeš muset na některých telefonech používat CONTROL_AF_MODE_CONTINUOUS_PICTURE namísto CONTROL_AF_MODE_AUTO. Třeba tady má implementovanou i tu podmínku, ale netuším, jestli zrovna tenhle kód funguje. Já jsem typicky používal nějaký framework nad tím (Vuforia a tak).
    DATEL
    DATEL --- ---
    Ahoj, implementoval jste někdo focení skrz CameraX API? Pokud ano, funguje vám autofocus, popřípadě focus po tapnutí na preview (s vlastní implementací samozřejmě) na Samsung telefonech? Ideálně konkrétně na S8?
    DRIZDIK
    DRIZDIK --- ---
    Pro ty co používají fastlane pro deployment, je k nečemu dobré pouštět ve fastlane pouštěné testy, když je mám i předtím v pipelině?
    KAERO
    KAERO --- ---
    DRIZDIK: jo, tak jsem tam nacpal i ty translation tools, a programy zajmu zadrou na pouziti bluetooth. ve chvili kdy ma nastat pripojeni tak spadnou. pritom z hostitelske masiny jsem schopen se tomu bluetooth zarizeni ozvat. emulace holt ma sve mouchy:(
    DRIZDIK
    DRIZDIK --- ---
    KAERO: To máš spíš jen špatné APK .. většina APK je vydávána pro více ABI (platforem) a v zájmu udržení velikosti APK jsou ty APK oddělené pro jednotlivé platformy a tys někde stáhnul ARM místo x86 a emulátor máš na x86.
    Ale jinak by translation tools měly být jen o drag&drop na emulátor
    KAERO
    KAERO --- ---
    Hm, tak genymotion je hezky, ale ten program nespusti, potrebuje arm translation tools a to zacina byt komplikovane.
    zacinam si myslet ze koupit nejaky tablet z druhe ruky by bylo skoro uz financne lepsi vzhledem k tomu kolik casu jsem na tom stravil...

    jenze problem je ze kdyz bude android primo na hw, tak nemuzu udelat jednoduchou zalohu stavu jako treba ve virtualboxu

    cert vem android, nemam ho rad :(
    DRIZDIK
    DRIZDIK --- ---
    KAERO: Mají i desktop, pro personal use se dá stáhnout zdarma. Sám jsem ho už dlouho nepoužil, ale byl to asi nejlepší emulátor. https://www.genymotion.com/fun-zone/
    KAERO
    KAERO --- ---
    ech, omlouvam se, puvodne jsem to chtel napsat do linuxoveho auditka a pak jsem si uvedomil ze tady to bude smysluplnejsi. mam linux ubuntu 18.04.

    MIKULAS: dik, bohuzel je to jen pro windows/macos.

    STARF: aha, dik, zkusim dohledat. vcera jsem jeste resil problemy ze AVD se nechce poustet, zatim googlim a pomalu postupuju jak to vubec rozchodit.

    DRIZDIK: hm, jsem z toho uplne zmateny. tak je jenom cloud nebo i desktop? je jen placeny nebo i zdarma pro osobni pouziti? nachazim na jejich strankach rozporuplne informace.
    DRIZDIK
    DRIZDIK --- ---
    KAERO: Ten Genymotion by měl být dobrý, nezavrhoval bych ho tak rychle.
    STARF
    STARF --- ---
    KAERO: Nevim, co mas za OS.. kazdopadne pochopitelne jde Android Emulator pustit bez AS.
    Na macOS takto (jestli mas jiny system, dogoogli si treba "run AVD without Android Studio"):

    ~/Library/Android/sdk/tools/emulator -list-avds
    cd ~/Library/Android/Sdk/tools && ./emulator -avd Pixel_3a_API_29
    KAERO
    KAERO --- ---
    Chtel jsem poustet nejake programy, co jsou jen na androidu. Ale nechci si je strkat na telefon ("aplikace" Lego Boost, ovladani cinskeho robota). Tak jsem se kouknul na moznosti virtualizace androidu v linuxu.

    Jel jsem podle tohoto navodu:
    Best Way to Run Android Apps and Games on Linux – Linux Hint
    https://linuxhint.com/android_apps_games_linux/
    Anbox: funguje, ale jen pro nektere programy. Treba ctecka knih v poho, ale ty co potrebuju ne - zobrazi se jen prazdne okno. Problem s graficky narocnejsimi programy?
    Arc Welder: opet, nektere programy jedou, ty co potrebuju ne.
    Genymotion: cloud nechci, mam rad veci doma na svem disku.
    Android-x86: reseni pres virtual box - to vypadalo dobre. Bohuzel ale casto programy uvnitr padaji, treba google play jsem spustil az na potreti, a pri aktualizaci zase chyba. Pisou ze je potreba dat vice procesoru, ale ani 4 nepomohly. Nedohledal jsem kde je problem.
    Android Studio IDE: pripada mi ze tohle neni pouzitelne na pravidelne spousteni nekolika androidich programu. Jde ta virtualizace postet bez celeho vyvojoveho prostredi? Jeste jsem to uplne nerozchodil.

    Tak nejak jsem mel pocit, ze to s androidem bude jednoduche. Jeden balik z repozitaru a budu mit kompletni virtualni android. Ale ono ne.

    Virtualizujete nejak android? Minul jsem nejakou moznost?
    CNV
    CNV --- ---
    ADAMH: Takže postarat se o to ručně. Dík, to jsem chtěla vědět.
    ADAMH
    ADAMH --- ---
    CNV: Pri kazde zmene zvysit cislo verze SQLiteOpenHelper a v onUpgrade vyresit adekvatni zmenou, tj alter table pro upravy, create table pro nove tabulky.

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    if (oldVersion <2) {

    db.execSQL("create table blabla("
    + "_id integer primary key,"
    + "blabla integer,"
    + "blabla2 int"
    + ");");

    }

    if (oldVersion <3) {

    db.execSQL("ALTER TABLE blabla ADD COLUMN blabla2 integer");
    }
    CNV
    CNV --- ---
    Mám začátečnický dotaz. Mám v aplikaci SQLite databázi, ve které jsou tabulky s různými položkami a jedna tabulka, jejíž obsah mění uživatel (v aplikaci si zaklikává, které z těch položek má a kolik kusů). Když do databáze přidám další tabulky a rozešlu uživatelům nové APK, přepíše se jim komplet databáze, nebo se jen přidají nové tabulky?

    Snažím se pochopit, jak updaty fungujou, ale literatura a tutorialy se těmahle "drobnostma" moc nezabývají :)
    ADAMH
    ADAMH --- ---
    JOHNY_G: Dik,
    1) zkusim, koukam ze mam nejakou 3.6 a uz je venku 4.0
    2) zkusim zda to bude na to atributy v xml reagovat v kdyz ne tak pres tu javu, nejak si prepisu.
    JOHNY_G
    JOHNY_G --- ---
    ADAMH:
    1) Tohle vypadá na bug, jestli jsi do toho opravdu nijak nezasáhl. Zkus jinou verzi Android Studia, Build Tools, SDK... Nebo si to prostě udělej ručně podle nějakého tutorialu.

    2) Pokud používáš výhradně navigation components, tak se backstack řídí atributem popUpTo. Prakticky ti pokryje všechny běžné scénáře v momentě, kdy pochopíš root node (u tebe to bude asi @id/mobile_navigation, prostě ID elementu navigation ve tvém navigačním grafu) a popUpToInclusive. Je to ovšem poměrně neintuitivní, takže se obrň trpělivostí, a navíc to neřeší některé edge casy, typicky na starších Androidech. Takže se můžeš dostat do situace, kdy musíš přetížit onBackPressed a/nebo onSupportNavigateUp v aktivitě (není to totéž, i když se to tak bohužel v praxi často používá).

    Dám ti na to i příklady, ale jen v Kotlinu, protože jsem líný zrovna tohle přepisovat do Javy, kde by to byl nesrovnatelně delší kód.

    Mám dva jednoduché interfacy, které můžou a nemusí Fragmenty implementovat:
    interface IOnBackPressed {
        fun onBackPressed(): Boolean
    }
    
    interface IOnUpPressed {
    	fun onUpPressed(): Boolean
    }

    Aktivita se vždycky zeptá Fragmentu, jestli si to ohandluje sám:
    override fun onBackPressed() {
    	val fragment = nav_host_fragment?.childFragmentManager?.primaryNavigationFragment
    	// Teď se zeptám jestli mám vůbec referenci na aktivní fragment, jestli implementuje IOnBackPressed, a pokud ano, tak jestli ho ohandloval/zkonzumoval
    	if ((fragment as? IOnBackPressed)?.onBackPressed() != true) { 
    		super.onBackPressed()
    	}
    }
    
    override fun onSupportNavigateUp(): Boolean {
    	val fragment = nav_host_fragment?.childFragmentManager?.primaryNavigationFragment
    	return if ((fragment as? IOnUpPressed)?.onUpPressed() != true) {
    		// Tady se ještě zeptám navControlleru, jestli se měl kam vrátit; pokud ne, tak byl uživatel v rootu a ve skutečnosti kliknul v toolbaru nikoli na šipku, ale na ikonu menu, takže potřebuju otevřít hamburger menu.
    		// Ne vždycky se to musí řešit takhle, ale já mám v tomhle projektu z businessových požadavků dost komplikovanou definici rootu :-D
    		if (navController.navigateUp(appBarConfig)) {
    			true
    		} else {
    			drawer_layout.openDrawer(GravityCompat.START)
    			false
    		}
    	} else {
    		true
    	}	
    }

    A jednotlivé fragmenty mi oznámí, jestli mají nějakou tu výjimku. Pokud ji nemají vůbec, tak ty interfacy vůbec neimplementuju, ale můžou prostě vracet false:
    // Tenhle fragment se vždycky šipkou v toolbaru vrací na homescreen, ať se tam šlo odkudkoli, neboť si to klient přál a na legacy Androidech zlobí popUpTo do rootu
    override fun onUpPressed(): Boolean {
    	navController.navigate(ResultFragmentDirections.goToHome())
    	return true
    }
    
    // Tenhle fragment používá na přáni klienta custom klávesnici, takže emuluji chování té systémové, která se tlačítkem zpět nejprve schová (a hodnotou true zabrání aktivitě návrat ve stacku) a až když je schovaná, tak dalším stiskem vyhodí false a nechá aktivitu dělat její práci.
    // To je třeba hezký příklad toho, že back (tlačítko/gesto) není to samé jako up (šipka v toolbaru), protože tam se vracíme rovnou, klávesnice neklávesnice:
    override fun onBackPressed(): Boolean {
    	if (viewModel.keyboardShown.get()) {
    		viewModel.keyboardShown.set(false)
    		return true
    	}
    
    	return false
    }

    Jak vidíš z těch příkladů, jsou to vážně edge cases, které v zásadě odporují konvencím platformy. Když ti nedýchá na záda klient, měl by sis vystačit s navigačním grafem.
    ADAMH
    ADAMH --- ---
    DRIZDIK: 1) No těžko říct zda ano a jak to zjistit, čekal bych od templatu vytvoření aplikace že bude funkční ve stavu v jakém je vytvořen.
    2) jediné co jsem našel jako asi správné je action element v "mobile_navigation.xml" ale nastavit tam back button nevidím, návody na to nejsou, je to asi relativně nové
    DRIZDIK
    DRIZDIK --- ---
    ADAMH:
    1) očekávám že přes to máš ještě nějaký layout, který ti zachytává dotyky
    2) dvě možnosti .. bud používáš jen fragmenty a zpět je backstack pop (všechno ostatní si musíš dělat manuálně), případně používáš navigation component, kde si v tom grafu určuješ, jak se má navigace v jednotlivých přechodech chovat
    ADAMH
    ADAMH --- ---
    Zeptal bych se znova, pokud bude mít ještě někdo chuť odpovedět.

    1) v čisté nové aplikaci bez jakéhokoli zásahu mě v emulátoru ani v mobilu nereaguje aplikace na touch v menu (navigation drawer) s navcontrolerem, divny, ze pokud si v emulatoru otevru to menu mysi a pak klikam na šipky na klávesnici nahoru a dolu a dám enter tak se ten fragment změní, ale klasickej dotyk nic, co tam schází?

    2) chtěl bych to dělat správně, ale např jsem narazil, že nevím jak určit jaký fragment se má aktivovat po zmačknutí tlačítka zpět, předpokládal bych že to jde přes XML "mobile_navigation.xml" , overidovat onBackPressed v activitě se mě moc nechce , když jedu na fragmenty

    To by bylo asi prozatím vše.
    Kliknutím sem můžete změnit nastavení reklam