Ao longo das aulas temos vindo a utilizar algumas das bibliotecas do Android Jetpack, nesta aula vamos focar-nos essencialmente em trĂȘs:
- Room
- CameraX
- Introdução a Compose
por semana âą 14 Outubro a 16 Dezembro âą YouTube live âą Suporte assĂncrono contĂnuo via Discord/email âą Todo o cĂłdigo disponĂvel no GitHub Photo by Arif Riyanto on Unspla O programa
Outubro Bem-vindos ao Android #2 28 de Outubro FundaçÔes I #3 04 de Novembro FundaçÔes II #4 11 de Novembro FundaçÔes III #5 18 de Novembro Listas, listas e mais listas #6 25 de Novembro Jetpack, Jetpack, Jetpack! #7 - #8 02 - 03 de Dezembro Firebase #9 - #10 09 - 10 de Dezembro MLKit & TensorFlow #11 16 de Dezembro Resumo Semana Semana CalendĂĄrio â â â â Direto â â
performance e flexibilidade âą Permite criar uma lista de objetos facilmente âą Esta lista tanto pode ser horizontal como vertical ⊠Dependendo do LayoutManager definido âą Ă possibilidade adicionar animaçÔes (incrĂveis) por cada item modificado RecyclerView
design modernas, as bibliotecas do Android Jetpack permitem menos crashes e memory leaks, com compatibilidade com versĂ”es anteriores jĂĄ incluĂdas PorquĂȘ usar Android Jetpack?
design modernas, as bibliotecas do Android Jetpack permitem menos crashes e memory leaks, com compatibilidade com versĂ”es anteriores jĂĄ incluĂdas PorquĂȘ usar Android Jetpack? Eliminar cĂłdigo boilerplate O Android Jetpack gere aquelas atividades chatas, como processamento em background, navegação e gestĂŁo do ciclo de vida da aplicação, para que os programadores se possam concentrar no que torna a aplicação espetacular.
toda a nossa aplicação. Ă Ăłtimo existir uma forma recomenda, opinativa, e clara de construir uma aplicação Android que facilita suportar alteração de configuraçÔesâ - Drew Hannay, Engenheiro de Software, LinkedIn https://developer.android.com/jetpack/testimonials LinkedIn Testemunhos
Reduz a quantidade de cĂłdigo repetitivo âą Acesso Ă base de dados de forma mais robusta âą Valida as consultas em tempo de compilação âą Utilizado como cache da aplicação âą CompatĂvel com LiveData Room https://developer.android.com/topic/libraries/architecture/room
name ASC") fun getAlphabetizedDogs(): LiveData<List<DogModel>> @Insert(onConflict = OnConflictStrategy.IGNORE) fun insert(dog: Dog) @Query("DELETE FROM dog") fun deleteAll() } Como utilizar? Definir o DAO (Data access object) DogDAO.kt
name ASC") fun getAlphabetizedDogs(): LiveData<List<DogModel>> @Insert(onConflict = OnConflictStrategy.IGNORE) fun insert(dog: DogModel) @Query("DELETE FROM dog") fun deleteAll() } Como utilizar? Definir o DAO (Data access object) DogDAO.kt
name ASC") fun getAlphabetizedDogs(): LiveData<List<DogModel>> @Insert(onConflict = OnConflictStrategy.IGNORE) fun insert(dog: DogModel) @Query("DELETE FROM dog") fun deleteAll() } Como utilizar? Definir o DAO (Data access object) DogDAO.kt
name ASC") fun getAlphabetizedDogs(): LiveData<List<DogModel>> @Insert(onConflict = OnConflictStrategy.IGNORE) fun insert(dog: DogModel) @Query("DELETE FROM dog") fun deleteAll() } Como utilizar? Definir o DAO (Data access object) DogDAO.kt
name ASC") fun getAlphabetizedDogs(): LiveData<List<DogModel>> @Insert(onConflict = OnConflictStrategy.IGNORE) fun insert(dog: Dog) @Query("DELETE FROM dog") fun deleteAll() } Como utilizar? Definir o DAO (Data access object) DogDAO.kt
class KennelDatabase : RoomDatabase() { abstract fun dogDao(): DogDAO companion object { @Volatile private var INSTANCE: KennelDatabase? = null fun getDatabase(context: Context): KennelDatabase { return INSTANCE ?: synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext,KennelDatabase::class.java, "dog_database" ).build() INSTANCE = instance instance } } val databaseWriteExecutor = Executors.newFixedThreadPool(2) } } Como utilizar? A base de dados KennelDatabase.kt
class KennelDatabase : RoomDatabase() { abstract fun dogDao(): DogDAO companion object { @Volatile private var INSTANCE: KennelDatabase? = null fun getDatabase(context: Context): KennelDatabase { return INSTANCE ?: synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext,KennelDatabase::class.java, "dog_database" ).build() INSTANCE = instance instance } } val databaseWriteExecutor = Executors.newFixedThreadPool(2) } } Como utilizar? A base de dados KennelDatabase.kt
class KennelDatabase : RoomDatabase() { abstract fun dogDao(): DogDAO companion object { @Volatile private var INSTANCE: KennelDatabase? = null fun getDatabase(context: Context): KennelDatabase { return INSTANCE ?: synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext,KennelDatabase::class.java, "dog_database" ).build() INSTANCE = instance instance } } val databaseWriteExecutor = Executors.newFixedThreadPool(2) } } Como utilizar? A base de dados KennelDatabase.kt
class KennelDatabase : RoomDatabase() { abstract fun dogDao(): DogDAO companion object { @Volatile private var INSTANCE: KennelDatabase? = null fun getDatabase(context: Context): KennelDatabase { return INSTANCE ?: synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext,KennelDatabase::class.java, "dog_database" ).build() INSTANCE = instance instance } } val databaseWriteExecutor = Executors.newFixedThreadPool(2) } } Como utilizar? A base de dados KennelDatabase.kt
class KennelDatabase : RoomDatabase() { abstract fun dogDao(): DogDAO companion object { @Volatile private var INSTANCE: KennelDatabase? = null fun getDatabase(context: Context): KennelDatabase { return INSTANCE ?: synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext,KennelDatabase::class.java, "dog_database" ).build() INSTANCE = instance instance } } val databaseWriteExecutor = Executors.newFixedThreadPool(2) } } Como utilizar? A base de dados KennelDatabase.kt
override fun <T : ViewModel> create(modelClass: Class<T>): T { if (modelClass.isAssignableFrom(MainViewModel::class.java)) { @Suppress("UNCHECKED_CAST") return MainViewModel(repository) as T } throw IllegalArgumentException("Unknown ViewModel class") } } Como utilizar? No ViewModelProvider MainViewModel.kt
openNativeCamera() { val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } Passamos a criar tudo de raiz...
android:layout_width="match_parent" android:layout_height="match_parent" /> </androidx.constraintlayout.widget.ConstraintLayout> Como utilizar? Definir o layout activity_camera.kt
android:layout_width="match_parent" android:layout_height="match_parent" /> </androidx.constraintlayout.widget.ConstraintLayout> Como utilizar? Definir o layout activity_camera.kt
⹠Permite construir componentes gråficos de forma declarativa ⹠Interoperåvel com os componentes nativos ⹠Reduz a quantidade de código necessårio para criar interfaces gråficas ⹠Tira partido das vantagens de Kotlin para facilitar a escrita de código α
Carregar em Android Studio na barra de açÔes 2. Preferences 3. Pesquisar por Font 4. Appe... & Behavior â Appearance 5. Alterar para a fonte pretendida
Carregar em Android Studio na barra de açÔes 2. Preferences 3. Pesquisar por Font 4. Appe... & Behavior â Appearance 5. Alterar para a fonte pretendida
do teu telemĂłvel no teu computador âą Permite controlares o teu telemĂłvel remotamente âą Funciona em GNU/Linux, Windows e macOS apt install scrcpy //Linux choco install scrcpy //Windows brew install scrcpy //macOS https://github.com/genymobile/scrcpy
⊠BottomNavigationView âȘ Main (MainFragment.kt) âȘ Lista de raças (ListFragment.kt) âȘ Raças favoritas (FavoritesFragment.kt) âȘ About (AboutFragment.kt)