Jetpack Compose简易入坑,腾讯Android开发面试

效果如下:

示例

代码很简单,但是这是一个函数,用Composable修饰,就表示一个UI状态,只需要在MainActivity的onCreate()里面调用setContent()就可以:

class MainActivity : ComponentActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContent { TextViewDemo() }

}

}

复制代码

这就完事了。

到这里,我们可以了解到:

  • 1 Compose是声明式UI,不是传统的命令式UI,不是拿着View去setXXX(),而是用函数去描述一种UI状态。

  • 2 Compose采用的是属性细化和行为隔离的思想,比如demo里面,text就是Text直接的属性,而background是modifier的一个属性,因为像图片Image就没有text属性,但是却有background属性,所以Compose就将公有属性提取到Modifier中,将独有属性绑定到View自身,这就是一种属性细化的思想,而且点击事件是在Modifier中,也就是通过Modifier来控制行为,这就是行为和属性分开。换句话说,View本身只负责描述自身固有属性,Modifier负责描述扩展属性和行为,这样设计更人性化,变相降低了耦合。

实践


我们来看个功能,这是谷歌的Android Study Jam 结课小测验,要求实现一个Searchbar。

先看效果:

示例

很简单,输入关键词,点击搜索,就列出包含关键词的条目,关键词为空就列出全部,如果我们用原生实现,可能需要写一个RecyclerView,一个Adapter,一个ViewHolder…,我们来看Compose版本的:

1 实现上方Searchbar

@Composable

fun SearchBar(onSearch: (keyword: String) -> Unit) {

var value by remember { mutableStateOf(“”) }

OutlinedTextField(

label = { Text(text = “Please input keyword”) },

value = value,

onValueChange = { value = it },

modifier = Modifier

.padding(horizontal = 16.dp)

.fillMaxWidth(),

singleLine = true,

textStyle = TextStyle(color = Color.DarkGray, fontWeight = FontWeight.W700),

trailingIcon = @Composable { Image(imageVector = Icons.Filled.Clear, contentDescription = null, Modifier.clickable { value = “” }) },

keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search),

keyboardActions = KeyboardActions(onSearch = { onSearch.invoke(value) }),

)

}

复制代码

函数接收一个onSearch()方法,传递一个String;OutlinedTextField可以理解为EditText,value就等价于EditText的text属性,trailingIcon表示尾部图标,就是那个关闭的X,点击它的时候,我们把value设置为空串,等价于清除,keyboardOptions表示键盘return的图标,我们定义为ImeAction.Search,也就是搜索;keyboardActions表示点击return执行的方法,我们直接调用onSearch(),如图:

示例

红色的x就是trailingIcon指定的,搜索就是keyboardOptions指定的。

2 实现下方列表

@Composable

fun ContentList(contentData: ContentsListData) {

val contents by contentData.getDisplayData().observeAsState(listOf())

LazyColumn(modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.Start) {

items(contents) { content ->

Text(text = content, modifier = Modifier.padding(4.dp))

}

}

}

复制代码

函数接收一个LiveData;其中LazyColumn可以理解为Compose中的RecyclerView,items是内部的一个lambda,表示将contents这个list展开,然后去构造Text,contents的size是多少,就会构造多少个Text。

3 组合UI

@Composable

fun HomeScreen() {

Column {

SearchBar { keyword ->

Toast.makeText(this@MainActivity, “keyword is $keyword”, Toast.LENGTH_SHORT).show()

viewModel.filter(keyword = keyword)

}

Spacer(modifier = Modifier.size(8.dp))

ContentList(contentData = viewModel)

}

}

复制代码

Column等价于LinearLayout,Spacer等价于一个空白View,用来作为分割线。

4 数据部分

ContentsListData代码如下:

interface ContentsListData {

fun getDisplayData(): MutableLiveData<MutableList>

}

class MainViewModel : ViewModel(), ContentsListData {

// 所有数据

var totalDatas = MutableLiveData<MutableList>()

// 需要展示的数据

val displayDatas = MutableLiveData<MutableList>()

init {

// 添加测试数据

val totalList = mutableListOf()

for (index in 1…100) {

totalList.add(“content $index”)

}

val displayList = mutableListOf()

totalList.forEach { displayList.add(it) }

totalDatas.value = totalList

displayDatas.value = displayList

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

尾声

面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Android核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、热修复设计、插件化框架解读、组件化框架设计、图片加载框架、网络、设计模式、设计思想与代码质量优化、程序性能优化、开发效率优化、设计模式、负载均衡、算法、数据结构、高级UI晋升、Framework内核解析、Android组件内核等。

不仅有学习文档,视频+笔记提高学习效率,还能稳固你的知识,形成良好的系统的知识体系。这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!

image

大厂面试真题

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

《2017-2021字节跳动Android面试历年真题解析》

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-uTdkuKXl-1712570772534)]

《2017-2021字节跳动Android面试历年真题解析》

[外链图片转存中…(img-GBawpLj1-1712570772534)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值