原文地址:Jetpack Compose学习(1)——从登录页开始入门 | Stars-One的杂货小窝

Jetpack Compose UI在前几天出了1.0正式版,之前一直还在观望,终于是出了正式版 趁着无事,来篇入门教程,希望给各位一点参考

注:由于compose UI使用了kotlin的DSL语言特性,所以需要熟悉Kotlin

Jetpack Compose介绍

Jetpack Compose 是一个用于构建原生 Android UI 的现代工具包。Jetpack Compose 用更少的代码、强大的工具和直观的 Kotlin API 简化并加速了 Android 上的 UI 开发。

Jetpack Compose使用了声明式来编写UI,本质上就是用代码写布局,这里说的代码不是特指,主要是与htmlxml等标识语言进行区别,在xml等语言中,我们无法使用if或循环等结构体来构造UI,而JetCompose Compose 而可以实现这点,这样会让我们布局更加灵活

如果之前各位也是接触过Flutter,就会和我有一样的体会,Jetpack Compose里面的组件类定义跟Flutter那边十分一致,我猜测肯定是有借鉴,毕竟那边也是Google公司旗下的团队整的

过多的就不说了,上正文吧

简单Hello World

首先,你需要一台联网的电脑,下载Android Studio最新版(2020.3.1) ,好久没升级了,界面都感觉焕然一新了

之后的环境配置这里不多说了,下SDK,下模拟器,新人来 估计得折腾一天 由于我之前就已经下载过Android Studio,这里直接下载好之后就可以使用了

我们按照官方的教程,直接新建一个Jetpack Compose项目

之后常规操作 ,填写相关的包名即可新建了,之后又是等待下载相关依赖的东西,一切下载完毕就准备OK了

可一看右边,一个红色的背景,顿时人就有点烦了,还好不是什么大问题,它提示我们需要build一下项目

行吧,我build一下,然后,人傻了,直接爆红了

一看提示 好家伙,最低的Java环境要11了,我也是服了,百度一搜

原来是Android官方那边的坑,直接把gradle升级到最新版,你说你升级就升级吧,可没想到gradle那边最新版弃用JDK8了

解决方法有两个

  • 更改Android Gradle Plugin和Gradle版本
  • 使用JDK11环境

更改Android Gradle Plugin和Gradle版本,也就是下图这两个东西,自己参考下之前旧版本项目的版本号改即可

PS: 通过File -> Project Structure打开下面的界面

下图是我自己旧项目使用的版本号,各位可以参考下

至于换JDK11,其实也是比较简单,我是环境变量都是用着JDK8,因为还有旧项目需要使用(TornadoFx),所以,我们只改项目里使用的JDK版本即可

进到设置里修改即可,如下图

Android Studio其实内置有个JDK11,我们直接使用这个即可,而且,不会影响其他新开的项目

经过上面的设置后,我们可以重新build下项目,可以发现右侧已经可以预览了

我们先简单分析一下代码

onCreate()中,有个setContent(),用来设置页面的主体内容,我们先不管ComposeDemoThemeSurface,Greeting("Android")是我们要关心的

setContent {
ComposeDemoTheme {
// A surface container using the 'background' color from the theme
Surface(color = MaterialTheme.colors.background) {
Greeting("Android")
}
}
}

此方法上有个注解@Composable,用来表示当前方法返回的是一个组件,我们可以更改其中的数值,可以看到右侧会实时的进行变化

提示: 实时渲染只针对数值的改变,如果你新增一个组件,是没有实时变化效果的,需要重新build一次

下面也有个方法,除了@Composable注解,还有有个@Preview,Preview主要是标明用来预览的

标有@Preview注解的方法,不能存在有参数,否则无法预览

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
ComposeDemoTheme {
// A surface container using the 'background' color from the theme
Surface(color = MaterialTheme.colors.background) {
Greeting("Android")
}
}
}

登录页实现

上面也是比较简单的讲解了下代码,下面我们来个登录页实例来操作下吧

与Flutter一样,Jetpack Compose没有线性布局(LinearLayout),但有Row和Column两个布局,从名字可以看得出来,一种是水平布局,一种是垂直布局

我们先简单搭建个登录页面

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
ComposeDemoTheme {
Column() {
Row() {
Text(text = "用户名")
TextField(value = "", onValueChange = {str -> Log.e("test",str)})
}
Row() {
Text(text = "密码")
TextField(value = "", onValueChange = {str -> Log.e("test",str)})
}
TextButton(onClick = { }) {
Text(text = "登录")
}
}
}
}

上面代码中出现了几个组件Text,TextField和TextButton,字面意思很好理解

组件名 作用
Text 文本
TextField 输入框
TextButton 文字按钮

预览效果如下图所示:

测试的发现,无法输入文字,这是怎么回事呢?

因为Jetpack Compose使用了类似MVVM的数据绑定的方式,所以,我们得给输入框绑定一个变量,onValueChange方法数值改变的时候会回调,我们在回调更改变量的数值即可达到更改UI的效果

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
var name by remember { mutableStateOf("") }
var pwd by remember { mutableStateOf("") } ComposeDemoTheme {
Column() {
Row() {
Text(text = "用户名")
TextField(value = name, onValueChange = { str -> name = str })
}
Row() {
Text(text = "密码")
TextField(value = pwd, onValueChange = { str -> pwd = str })
}
TextButton(onClick = { }) {
Text(text = "登录")
}
}
}
}

上面代码出现了remembermutableStateOf的两个关键字,但本章作为入门篇,先暂时不讲解过多知识,先放着,后续再进行补充

最后,我们还差一步,就是判断输入的账号和密码是否正确,然后弹出登录失败或登录成功的提示

这里,我准备使用传统简单的Toast进行提示,但是Toast需要传一个Context,由于组件的那个函数是写在Activity外面的,所以是拿不到Activity本身的,但是我们可以把Activity本身传到方法里(但不确定我这方法规不规范)

PS:看了下对话框的使用,觉得有些复杂,也是放在之后再讲解吧

@Composable
fun DefaultPreview(context: Activity) {
var name by remember { mutableStateOf("") }
var pwd by remember { mutableStateOf("") } ComposeDemoTheme {
Column() {
Row() {
Text(text = "用户名")
TextField(value = name, onValueChange = { str -> name = str })
}
Row() {
Text(text = "密码")
TextField(value = pwd, onValueChange = { str -> pwd = str })
}
TextButton(onClick = {
if (name == "test" && pwd == "123") {
Toast.makeText(context, "登录成功", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(context, "登录失败", Toast.LENGTH_SHORT).show()
}
}) {
Text(text = "登录")
}
}
}
}

最后效果如下图所示

参考

Jetpack Compose学习(1)——从登录页开始入门的更多相关文章

  1. Jetpack Compose学习(5)——从登录页美化开始学习布局组件使用

    原文:Jetpack Compose学习(5)--从登录页美化开始学习布局组件使用 | Stars-One的杂货小窝 本篇主要讲解常用的布局,会与原生Android的布局控件进行对比说明,请确保了解A ...

  2. Jetpack Compose学习(8)——State及remeber

    原文地址: Jetpack Compose学习(8)--State状态及remeber关键字 - Stars-One的杂货小窝 之前我们使用TextField,使用到了两个关键字remember和mu ...

  3. Jetpack Compose学习(3)——图标(Icon) 按钮(Button) 输入框(TextField) 的使用

    原文地址: Jetpack Compose学习(3)--图标(Icon) 按钮(Button) 输入框(TextField) 的使用 | Stars-One的杂货小窝 本篇分别对常用的组件:图标(Ic ...

  4. Jetpack Compose学习(2)——文本(Text)的使用

    原文: Jetpack Compose学习(2)--文本(Text)的使用 | Stars-One的杂货小窝 对于开发来说,文字最为基础的组件,我们先从这两个使用开始吧 本篇涉及到Kotlin和DSL ...

  5. Jetpack Compose学习(4)——Image(图片)使用及Coil图片异步加载库使用

    原文地址 Jetpack Compose学习(4)--Image(图片)使用及Coil图片异步加载库使用 | Stars-One的杂货小窝 本篇讲解下关于Image的使用及使用Coil开源库异步加载网 ...

  6. Jetpack Compose学习(6)——关于Modifier的妙用

    原文: Jetpack Compose学习(6)--关于Modifier的妙用 | Stars-One的杂货小窝 之前学习记录中也是陆陆续续地将常用的Modifier的方法穿插进去了,本期就来详细的讲 ...

  7. Jetpack Compose学习(7)——MD样式架构组件Scaffold及导航底部菜单

    Jetpack Compose学习(7)--MD样式架构组件Scaffold及导航底部菜单 | Stars-One的杂货小窝 Compose给我们提供了一个Material Design样式的首页组件 ...

  8. Jetpack Compose学习(9)——Compose中的列表控件(LazyRow和LazyColumn)

    原文:Jetpack Compose学习(9)--Compose中的列表控件(LazyRow和LazyColumn) - Stars-One的杂货小窝 经过前面的学习,大致上已掌握了compose的基 ...

  9. Spring Security笔记:自定义登录页

    以下内容参考了 http://www.mkyong.com/spring-security/spring-security-form-login-example/ 接上回,在前面的Hello Worl ...

随机推荐

  1. unity 通过JsonUtility实现json数据的本地保存和读取

    本文主要讲解json数据在本地的保存和读取,使用的是unity5之后提供的JsonUtility工具. 一.关于json数据的保存 在实际开发中,有时候可能涉及到大量数据保存到本地,以便于下次客户端的 ...

  2. Java基础篇(JVM)——字节码详解

    这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎 ...

  3. Flask(5)- 动态路由

    前言 前面几篇文章讲的路由路径(rule)都是固定的,就是一个路径和一个视图函数绑定,当访问这条路径时会触发相应的处理函数 这样无法处理复杂的情况,比如常见的一个课程分类下有很多个课程,那么他们的 p ...

  4. Java:java -jar命令讲解

    1. 当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 #正常启动jar包 java -jar XXX.jar#当前ssh窗口被锁定,可按CTRL + C打断程序运行, ...

  5. spring boot j集成seagger 加入拦截器后 swagger 不能访问

    一开始我是这样排除拦截的,但是发现没用 后来我发现swagger的真实访问路径是这样的 转自: https://blog.csdn.net/ab1991823/article/details/7906 ...

  6. php漏洞 md5函数漏洞

    0x01: 背景:php在处理哈希值时,用!=和==来比较的时候,如果哈希字符串以0E开头的时候,哈希值会默认为0,所以两个不同的字符串经过md5加密成哈希值,如果哈希值开头是0E的话,会默认成相等. ...

  7. ROS2学习之旅(4)——理解ROS2 Graph中的节点

    ROS(2)图(ROS(2) graph)是一个同时处理数据的基于ROS2元素的网络,它包含了所有的可执行文件以及它们之间的连接.图中的基本元素包括:节点(nodes).话题(topics).服务(s ...

  8. HAL库直流电机编码测速(L298N驱动)笔记

    主函数开始后的处理流程: 1.外设初始化:HAL_Init() 2.系统时钟配置 RCC振荡器初始化:HAL_RCC_OsConfig() RCC时钟初始化:HAL_RCC_ClockConfig() ...

  9. RSTP_PA协商过程

    P/A协商的基本需求: P:①DP端口,②discarding A:①P2P链路 所有交换机的stp mode改为rstp,确保sw2的g0/0/3为AP,sw3的g0/0/3为DP 把sw3的g0/ ...

  10. SHELL 变量引用

    shell变量的引用非常重要,运用技巧灵活多变 变量的引用主要包含四类:双引号引用.单引号引用.反引号引用.反斜线引用 " " 双引号 屏蔽除美元符号$.反引号( ` )和反斜线( ...