网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
adjustUnspecified
是主窗口行为的默认设置。文件说:
未指定活动的主窗口是否调整大小以便为软键盘腾出空间,或者是否平移窗口的内容以使当前焦点在屏幕上可见。系统会根据窗口的内容是否有任何可以滚动其内容的布局视图来自动选择其中一种模式。如果存在这样的视图,则窗口将被调整大小,假设滚动可以使窗口的所有内容在较小的区域内可见。
adjustResize:
Activity 的主窗口总是调整大小,以便为屏幕上的软键盘腾出空间。
adjustPan:
Activity
的主窗口没有调整大小来为软键盘腾出空间。相反,窗口的内容会自动平移,因此当前焦点永远不会被键盘遮挡,用户始终可以看到他们正在输入的内容。这通常不如调整大小可取,因为用户可能需要关闭软键盘才能到达窗口的模糊部分并与之交互。
如果你回想上一个截图,窗口显然没有调整大小。所以, …
系统会根据窗口的内容是否有任何可以滚动其内容的布局视图来自动选择其中一种模式。
… 似乎不适用于 Compose 应用程序。这当然不足为奇,因为使用setContent { … }is显示的 Compose 层次结构的根视图ComposeView,它 extends AbstractComposeView,它又扩展ViewGroup(它不能滚动)。
所以,修复很简单:只需添加
android:windowSoftInputMode="adjustResize"
到你的标签。
多个文本字段
让我们看看另一个 Compose 层次结构:
@Composable
fun KeyboardHandlingDemo2() {
val states = remember {
mutableStateListOf("1", "2", "3",
"4", "5", "6", "7", "8", "9", "10")
}
val listState = rememberLazyListState()
LazyColumn(
state = listState,
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally
) {
itemsIndexed(states) { i, _ ->
OutlinedTextField(value = states[i],
modifier = Modifier.padding(top = 16.dp),
onValueChange = {
states[i] = it
},
label = {
Text("Text field ${i + 1}")
})
}
}
}
用户界面包含相当多的可编辑文本字段。但是,通过上述实现,用户不能使用软键盘移动到下一个字段,而必须单击并滚动。幸运的是,我们可以使用 Compose 键盘操作和选项轻松实现这一点。将以下行添加到对 的调用中OutlinedTextField():
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
keyboardActions = KeyboardActions(
onNext = {
focusManager.moveFocus(FocusDirection.Down)
}
),
我们将软键盘配置为显示一个特殊的Next键 ( ),并在 的回调中ImeAction.Next使用一个FocusManager(属于 package androidx.compose.ui.focus)导航(移动焦点)到(垂直)下一个文本字段。
onNextKeyboardActions
val focusManager = LocalFocusManager.current
很酷,对吧?不过,我们还需要做一件事。我们的文本字段属于可滚动列表。移动焦点不会更改当前可见的列表部分。以下是如何做到这一点:
listState.animateScrollToItem(i)
animateScrollToItem()是一个挂起函数,所以它应该从协程或另一个挂起函数中调用。
coroutineScope.launch {
listState.animateScrollToItem(i)
}
最后,要在可组合函数中获得协程范围,您可以使用rememberCoroutineScope():
val coroutineScope = rememberCoroutineScope()
我还想向您展示一件事:如何关闭软键盘。
显示和隐藏软键盘
以下屏幕截图显示了我的KeyboardHandlingDemo3()
可组合函数。它允许用户在按下计算按钮或软键盘上的特殊完成键后输入一个数字并计算其平方。您在屏幕截图中看不到的内容:软键盘已关闭。这可能是希望在输入数据后再次显示完整的用户界面。
让我们看一下代码:
@ExperimentalComposeUiApi
@Composable
fun KeyboardHandlingDemo3() {
val kc = LocalSoftwareKeyboardController.current
var text by remember { mutableStateOf("") }
var result by remember { mutableStateOf("") }
val callback = {
result = try {
val num = text.toFloat()
num.pow(2.0F).toString()
} catch (ex: NumberFormatException) {
""
}
kc?.hide()
}
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
![](https://img-blog.csdnimg.cn/direct/743b668910224b259a5ffe804fa6d0db.png)
![img](https://img-blog.csdnimg.cn/img_convert/d2ae2f8da6273dfc1675d9de03463b01.png)
![img](https://img-blog.csdnimg.cn/img_convert/f51f0aa810beed2d1a81eeb546fea8f4.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**