Jetpack Compose系列(1)-初识Jetpck

Jetpack Compose是什么

2019年的I/O大会上,Google宣布Kotlin成为Android开发首选语言(这次不是第一次说了),且后续会有新的Jetpack API和功能将在Kotlin中提供,并同时开源Jetpack Compose。

简介

Jetpack是一套库、工具和指南,目的是为了帮助开发者更轻松的编写优质应用,与Kotlin一起提高开发者工作效率。Jetpack Compose是用于构建原生Android UI的现代工具包。使用更少的代码,强大的工具和直观的Kotlin API,简化并加速了Android上的UI开发。这是Android Developers 官网对它的描述。 值得一提的是,Jetpack Compose和苹果的SwiftIUI一样是一个声明式的UI框架。

为什么

Android中的原生UI工具包的使用历史可追溯到至少10年前。自那时以来,我们使用的设备,用户的期望,以及开发人员对他们所使用的开发工具、开发语言的期望等客观环境都发生了很大变化。另外一个重要原因是view.java这个类实在过大,包含3000+行代码,致使你甚至无法在Github上查看该文件,更可怕的是,我们所使用的几个每一个UI组件都需要继承自View。

Google的Android团队的Anna-Chiara表示,他们对已经实现的一些API感到遗憾,因为他们也无法在不破坏功能的情况下收回、修复或者扩展这些API,因此现在是一个全新起点的好时机。

分类

Architecture(架构组件)可帮助您设计稳健、可测试且易维护的应用:

  1. Data Binding: 是一种支持库,借助该库,可以以声明方式将可观察数据绑定到界面元素。

  2. Lifecycles: 管理Activity 和 Fragment的生命周期,能够帮助开发者轻松的应对Activity/Fragment的生命周期变化问题,帮助开发者生成更易于维护的轻量级代码。

  3. LiveData: 在底层数据库更改时通知视图,是可观察的数据持有者类。与常规的可观察对象不同,LiveData具有生命周期感知功能(例如Activity,Fragment或Service的生命周期)。

4.Navigation: 处理应用内导航所需的一切。

  1. Paging: 逐步从您的数据源按需加载信息,帮助开发者一次加载和显示小块数据。按需加载部分数据可减少网络带宽和系统资源的使用。

  2. Room: 流畅地访问 SQLite 数据库。在SQLite上提供了一个抽象层,以在利用SQLite的全部功能的同时允许更健壮的数据库访问。

  3. ViewModel: 以注重生命周期的方式管理界面相关的数据。ViewModel类允许数据幸免于配置更改(例如屏幕旋转)。通常和DataBinding配合使用,为开发者实现MVVM架构提供了强有力的支持。

  4. WorkManager: 管理 Android 的后台作业,即使应用程序退出或设备重新启动,也可以轻松地调度预期将要运行的可延迟异步任务。

Foundation(基础组件)可提供横向功能,例如向后兼容性、测试和 Kotlin 语言支持:

  1. Android KTX: 编写更简洁、惯用的 Kotlin 代码,是一组Kotlin扩展程序。优化了供Kotlin使用的Jetpack和Android平台API。旨在让开发者利用 Kotlin 语言功能(例如扩展函数/属性、lambda、命名参数和参数默认值),以更简洁、更愉悦、更惯用的方式使用 Kotlin 进行 Android 开发。Android KTX 不会向现有的 Android API 添加任何新功能。

  2. AppCompat: 帮助较低版本的Android系统进行兼容。

  3. Auto: 有助于开发 Android Auto 应用的组件。是 Google推出的专为汽车所设计之 Android 功能,旨在取代汽车制造商之原生车载系统来执行 Android应用与服务并访问与存取Android手机内容。

  4. Benchmark: 从 Android Studio 中快速检测基于 Kotlin 或 Java 的代码。

  5. Multidex: 为具有多个 DEX 文件的应用提供支持。

  6. Security: 按照安全最佳做法读写加密文件和共享偏好设置。

  7. Test: 用于单元和运行时界面测试的 Android 测试框架。

  8. TV: 有助于开发 Android TV 应用的组件。

  9. Wear OS by Google: 有助于开发 Wear 应用的组件。

Behavior(行为组件)可帮助您的应用与标准 Android 服务(如通知、权限、分享和 Google 助理)相集成:

  1. CameraX: 简化相机应用的开发工作。它提供一致且易于使用的 API 界面,适用于大多数 Android 设备,并可向后兼容至 Android 5.0(API 级别 21)。

  2. DownloadManager: 是一项系统服务,可处理长时间运行的HTTP下载。客户端可以请求将URI下载到特定的目标文件。下载管理器将在后台进行下载,处理HTTP交互,并在出现故障或在连接更改和系统重新启动后重试下载。

  3. Media & playback: 用于媒体播放和路由(包括 Google Cast)的向后兼容 API。

  4. Notifications: 提供向后兼容的通知 API,支持 Wear 和 Auto。

  5. Permissions: 用于检查和请求应用权限的兼容性 API。

  6. Preferences: 创建交互式设置屏幕,建议使用 AndroidX Preference Library 将用户可配置设置集成至应用中。

  7. Sharing: 提供适合应用操作栏的共享操作。

  8. Slices: 是UI模板,可以通过启用全屏应用程序之外的互动来帮助用户更快地执行任务,即可以创建在应用外部显示应用数据的灵活界面。

UI(界面组件)可提供微件和辅助程序,让您的应用不仅简单易用,还能带来愉悦体验。了解有助于简化界面开发的Jetpack Compose。

  1. Animation & transitions: 使开发者可以轻松地为两个视图层次结构之间的变化设置动画。该框架通过随时间更改其某些属性值在运行时为视图设置动画。该框架包括用于常见效果的内置动画,并允许开发者创建自定义动画和过渡生命周期回调。

  2. Emoji: 使Android设备保持最新的最新emoji表情,开发者的应用程序用户无需等待Android OS更新即可获取最新的表情符号。

  3. Fragment: Activity的模块化组成部分。

  4. Layout: 定义应用中的界面结构。可以在xml中声明界面元素,也可以在运行时实例化布局元素。

  5. Palette: 是一个支持库,可从图像中提取突出的颜色,以帮助开发者创建视觉上引人入胜的应用程序。开发者可以使用调色板库设计布局主题,并将自定义颜色应用于应用程序中的视觉元素。

应用架构

image.gif

环境准备和 Hello Android

要想获得Jetpack Compose 的最佳体验,我们最好下载最新版本的Android Studio 最少也要Android Studio 4.0以上(最好是用Bumblebee及以上版本),这个版本开始添加了对Jetpack Compose 的支持,如新的Compose 模版和Compose 及时预览)。

image.gif

创建一个支持Jetpack Compose的新应用

创建一个支持Jetpack Compose 的新项目十分简单,跟常规的创建羡慕步骤一致,需要注意的是在Select a Project Template 窗口时,选择Empty Compose Activity。

image.gif
然后Next -> Finish即可,需要注意的是Minimum API level 中最低只能是21(最低版本只兼容到21),语言只能选定Kotlin。

image.gif
Jetpack Compose 只能用Kotlin来写的代码才能运行起来,这点没得选。

最后点击Finish后,经过短时间的初始化,我们就进入到创建好的工程中,看到系统自动生成的代码:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyApplicationTheme {
                // A surface container using the 'background' color from the theme
                Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background) {
                    Greeting("Android")
                }
            }
        }
    }
}

@Composable
fun Greeting(name: String) {
    Text(text = "Hello $name!")
}

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
    MyApplicationTheme {
        Greeting("Android")
    }
}

onCreate()中的方法明显和Java版本默认生成的不大一样,这些放到后面讲。

image.gif
运行后即可看到,Hello Android!

让现有项目支持 Jetpack Compose

当然,要用到Jetpack Compose不一定需要重新另起工程,想要在现有项目中支持Jetpack Compose的话,只需要配置一些必备的设置和依赖:

1、修改gradle

2、将app目录下的build.gradle文件中的app支持的最低API 版本设置为21或更高,同时设置Jetpack Compose enable开启,添加工具包依赖。

android {
    defaultConfig {
        ...
        minSdkVersion 21
    }

    buildFeatures {
        // 设置compose开关为true
        compose true
    }
    ...

    // 设置java编译版本为8.0(这点是必须不可更改).

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
    dependencies {
    // You also need to include the following Compose toolkit dependencies.
    implementation 'androidx.ui:ui-tooling:0.1.0-dev02'
    implementation 'androidx.ui:ui-layout:0.1.0-dev02'
    implementation 'androidx.ui:ui-material:0.1.0-dev02'
    ...
}


}

3、引入Kotlin-Gradle 插件

Jetpack Compose 需要Kotlin-Gradle插件,使用需要在根目录下的build.gradle添加如下:

buildscript {
    repositories {
        google()
        jcenter()
        maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' }  //add this
        dependencies {
            classpath 'com.android.tools.build:gradle:4.0.0-alpha01'
            classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.60-eap-25'
        }
        ... ...
    }

    allprojects {
        repositories {
            google()
            jcenter()
            maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' }    //add this
        }
    }
}

这时将整个工程rebuild下,我们就可以开始进行Jetpack Compose的学习了。

一些可能会碰到的坑

1、Mac上更新最新版本AS后打开模拟器,无反应,再次点击会提示如此错误:

image.gif
按提示来,找到对应目录文件删掉然后重启就行。如果你就这样去Mac上找这个目录可能找不到,因为部分是隐藏目录,对应的你只需要去用户目录下按Command + Shift +句点(CMD + Shift +。)快捷键即可看到隐藏目录和文件。

image.gif
后续你删掉对应文件并重启AS成功打开模拟器后,程序发布时可能会提示以下报错:

An exception occurred applying plugin request [id: 'com.android.application']
        > Failed to apply plugin 'com.android.internal.application'.
> Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8.
You can try some of the following options:
- changing the IDE settings.
- changing the JAVA_HOME environment variable.
- changing `org.gradle.java.home` in `gradle.properties`.

这是因为AGP 7.0.0-alpha02起需要使用Java 11(https://developers-jp.googleblog.com/2020/12/announcing-android-gradle-plugin.html)
当Java版本不正确时,Gradle的sync阶段就会爆出上述错误,这里需要注意gradle的Java版本并非AS上这个工程依赖的Java版本。

对应解决策略是打开AS中对应的选项,AndroidStudio -> Preferences -> Gradle中进行设置Java版本Version为11。

image.gif
然后依次Download -> Apply -> OK 。等程序重新build结束,即可顺利发布。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/366667.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Camille-学习笔记-web基础知识

web基础1.系统架构 B/S :Browser/Server 网站 界面层(UI) 业务逻辑层(业务) 数据访问层(数据库) 静态网页:和服务器没有数据交互 动态网页:网页数据可以和服务器进行数据交互 URL…

MongoDB从入门到实战之MongoDB简介

前言 相信很多同学对MongoDB这个非关系型数据库都应该挺熟悉的,在一些高性能、动态扩缩容、高可用、海量数据存储、数据价值较低、高扩展的业务场景下MongoDB可能是我们的首选,因为MongoDB通常能让我们以更低的成本解决问题(包括学习、开发、…

【面试深度解析】快手后端一面:G1、IOC、AOP、并发、JVM生产问题定位、可重复读、ThreadLocal

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复 「资料」 可领取编程高频电子书! 在我后台回复「面试」可领取硬核面试笔记! 文章导读地址…

深度学习-基础过关

众所周知,机器学习是一门跨学科的学科,主要研究计算机如何通过学习人类的行为和思维模式,以实现某些特定的功能或目标。它涉及到概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科,使用计算机作为工具并致力于真实实时的…

IDEA JDBC配置

一、在pom中添加依赖 <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency></dependencies> 然后同步一下 二、编写代码…

前端入门第三天

目录 一、CSS定义 二、CSS引入方式 三、基础选择器 1.标签选择器 2.类选择器 3.id选择器 4.通配符选择器 5.画盒子 四、文字控制属性 1.字体大小 2.字体粗细 3.字体倾斜 4.行高 1.行高-垂直居中 5.字体族 6.font复合属性 7.文本缩进 8.文本对齐方式 1.水平对…

Java Swing实现思聪吃热狗游戏

引言 Java Swing&#xff0c;一种灵活的图形用户界面库&#xff0c;让我们可以以相对简便的方式创建图形化应用程序。在本文中&#xff0c;我们将讲述如何借助Swing构建一个简单的游戏&#xff1a;DogGame&#xff0c;它的规则是控制一只名为Wsc的狗来捕捉飞来的热狗。让我们浏…

PHP中的stdClass:一个动态的空白板

PHP中的stdClass&#xff1a;一个动态的空白板 在PHP编程中&#xff0c;灵活性和动态性是开发人员追求的重要目标。而stdClass作为PHP中的一个特殊类&#xff0c;为我们提供了一个通用的空白板&#xff0c;允许在运行时动态地添加属性和方法。它的存在为处理动态数据结构和临时…

使用gcc/g++查看C语言预处理,编译,汇编,连接,以及动静态库的区分

文章目录 使用gcc/ggcc如何完成编译后生成可执行文件&#xff1f;预处理(进行宏替换)编译&#xff08;生成汇编&#xff09;汇编&#xff08;生成机器可识别代码&#xff09;连接&#xff08;生成可执行文件或库文件&#xff09;最后记忆小技巧 在这里涉及到一个重要的概念&…

《HTML 简易速速上手小册》第4章:HTML 的表单与输入(2024 最新版)

文章目录 4.1 表单的基础&#xff08;&#x1f4dd;&#x1f680;&#x1f4ac; 开启沟通的大门&#xff09;4.1.1 表单基础知识点4.1.2 基础示例&#xff1a;创建一个简单的注册表单4.1.3 案例扩展一&#xff1a;创建一个调查问卷4.1.4 案例扩展二&#xff1a;创建一个预订表单…

Gson源码解读

一&#xff0c;概述 gson作为流行的json工具&#xff0c;笔者使用较多。本文主要目的是解读下Gson的源码实现&#xff0c;就没有然后了。 二&#xff0c;实例 实例如下图所示&#xff0c;笔者简单调用gson的toJson方法获得json字符串&#xff0c;fromJson则从json字符串解析…

最新2024如何解决谷歌浏览器Chrome谷歌翻译无法使用问题

快速恢复谷歌浏览器一键翻译功能在Chrome 中安装好【翻译】插件 Macbook 操作步骤&#xff1a; 1点击“前往”&#xff0c;打开“前往文件夹” 2 在对话框中输入“/etc” 囝找到“hosts”文件&#xff0c;复制粘贴到桌面 3 在复制的文件最后新起一行&#xff0c;输入并保存&am…

【CSS + ElementUI】el-tree下拉扩展图标置于右侧

效果图 代码实现 <template><div class"search_resource"><el-tree class"filter-tree" ref"tree" default-expand-all :data"directoryList" :props"defaultProps"icon-class"el-icon-arrow-right…

飞凌嵌入式RK3568开发板蓝牙收、发文件测试

本文由电子发烧友论坛用户fsdzdzy提供&#xff0c;感谢分享。飞凌嵌入式每月定期开展新的开发板体验活动&#xff0c;欢迎更多工程师朋友的关注和参与。 飞凌嵌入式OK3568-C开发板板载WiFi&BT模组&#xff0c;蓝牙版本为Bluetooth 5.0&#xff0c;速率高达3Mbps。笔者将在本…

MySQL之谈谈MySQL里的日志

文章目录 前言一、SQL是如何做更新操作的二、MySQL中的redo log三、MySQL中的binlog四、聊聊两阶段提交总结 前言 上一章我们讲了一条SQL是如何做查询的&#xff0c;其中经历了许多步骤。这次来讲讲一条SQL是如何做更新操作的。 常有大佬说他可以把MySQL恢复到半个月内任意一秒…

2024年美赛B题:寻找潜水器 Searching for Submersibles 思路模型代码解析

2024年美赛B题&#xff1a;寻找潜水器 Searching for Submersibles 思路模型代码解析 【点击最下方群名片&#xff0c;加入群聊&#xff0c;获取更多思路与代码哦~】 问题翻译 海上游轮迷你潜艇&#xff08;MCMS&#xff09;是一家位于希腊的公司&#xff0c;专门制造能够将人…

jQuery前段开发--星级评价和图形跟随指针移动

一、实验原理&#xff1a; 当鼠标移入某个星星&#xff0c;前面的星星都会被点亮&#xff1b;当鼠标移出&#xff0c;星星将会变暗&#xff0c;单击某个星星后&#xff0c;即可完成评论&#xff0c;此时鼠标移出后&#xff0c;被单击星星前面的星星都会被点亮&#xff0c;后面…

GmSSL - GmSSL的编译、安装和命令行基本指令

文章目录 Pre下载源代码(zip)编译与安装SM4加密解密SM3摘要SM2签名及验签SM2加密及解密生成SM2根证书rootcakey.pem及CA证书cakey.pem使用CA证书签发签名证书和加密证书将签名证书和ca证书合并为服务端证书certs.pem&#xff0c;并验证查看证书内容&#xff1a; Pre Java - 一…

在Mixamo网站上,下载的模型导入unity后没有材质怎么解决

在Mixamo网站上&#xff0c;下载的模型导入unity后没有材质 1.导入的模型没有材质2.解决方法3.提取后就有材质了 1.导入的模型没有材质 2.解决方法 选中导入的模型 > 选择提取纹理>选择你要提取到的文件夹(默认是当前文件夹)>点击 fix now 3.提取后就有材质了

力扣hot100 最小路径和 多维DP 滚动数组 一题多解

Problem: 64. 最小路径和 文章目录 思路&#x1f496; 朴素版&#x1f496; 空间优化版 思路 &#x1f468;‍&#x1f3eb; 路飞 &#x1f496; 朴素版 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) &#x1f30e; 空间复杂度: O ( n m ) O(nm) O(nm) class Solution {public …