Android CustomTextField

ops/2025/1/18 6:57:52/

在 Compose 中开发用户界面时,需要处理输入框和键盘的交互,例如在键盘弹出时调整布局位置,避免遮挡重要内容。本篇博客将通过一个完整的示例展示如何实现这一功能。

功能概述

本例实现了一个简单的输入框。当输入框获得焦点或输入文字时,以下行为发生:

  1. 键盘弹出。

  2. 输入框上方的占位符文本根据焦点状态和输入内容动态显示或隐藏。

  3. 整个布局根据键盘的弹出状态自动调整,避免内容被遮挡。

代码实现

封装TextField代码:
@Composable
fun CustomTextField(placeholderText: String, imageVector: Any) {// 定义状态变量管理输入框的文本和焦点状态var textValue by remember { mutableStateOf("") }var isTextFieldFocused by remember { mutableStateOf(false) }// 获取焦点管理器和键盘控制器val focusManager = LocalFocusManager.currentval keyboardController = LocalSoftwareKeyboardController.current// 动态计算底部间距,键盘弹出时调整布局val bottomPadding by animateDpAsState(targetValue = if (isTextFieldFocused || textValue.isNotEmpty()) 40.dp else 16.dp)// 使用 Box 包裹输入框和占位符文本Box {Column(modifier = Modifier.fillMaxWidth().height(70.dp),horizontalAlignment = Alignment.CenterHorizontally,verticalArrangement = Arrangement.Bottom) {// 输入框组件Row(modifier = Modifier.border(1.dp, Color.Black, RoundedCornerShape(16.dp)).clip(RoundedCornerShape(16.dp)).padding(0.dp) // 确保内边距为 0,避免额外的间距) {// 在 TextField 前添加图标,根据传入的 imageVector 参数显示不同图标Icon(imageVector = imageVector as androidx.compose.ui.graphics.vector.ImageVector,contentDescription = "Icon",modifier = Modifier.size(35.dp).padding(start = 10.dp,top = 15.dp,end = 0.dp,bottom = 0.dp))TextField(value = textValue,onValueChange = { newText ->textValue = newText},modifier = Modifier.width(300.dp).height(50.dp).onFocusChanged { focusState ->isTextFieldFocused = focusState.isFocused},keyboardOptions = KeyboardOptions.Default.copy(imeAction = ImeAction.Done),keyboardActions = KeyboardActions(onDone = {isTextFieldFocused = falsefocusManager.clearFocus()}))}}Column(modifier = Modifier.fillMaxWidth().height(70.dp),horizontalAlignment = Alignment.Start,verticalArrangement = Arrangement.Bottom) {// 占位符文本Text(text = placeholderText,modifier = Modifier.padding(start = 40.dp,top = 0.dp,end = 0.dp,bottom = bottomPadding).background(Color(235, 226, 241)),color = Color.Gray)}}
}

界面逻辑代码:

@Composable
fun BoxAlignmentExample() {// 设置 Surface 作为背景容器,填充整个屏幕Surface(modifier = Modifier.fillMaxWidth().fillMaxHeight(),color = Color(235, 226, 241)) {// 使用 Column 布局排列内容Column(modifier = Modifier.fillMaxSize().padding(16.dp),horizontalAlignment = Alignment.CenterHorizontally,verticalArrangement = Arrangement.Top) {// nameCustomTextField(placeholderText = " 请输入账号 ", imageVector = Icons.Default.Person)// passwordCustomTextField(placeholderText = " 请输入密码 ", imageVector = Icons.Default.Lock)}}
}

核心实现

  1. 状态管理 使用 remember 和 mutableStateOf 管理输入框文本内容 (textValue) 和焦点状态 (isTextFieldFocused)。

  2. 动画效果 借助 animateDpAsState 动态调整布局底部间距 bottomPadding,为界面变化提供平滑过渡。

  3. 输入框的焦点处理

    • 使用 onFocusChanged 检测输入框的焦点状态,更新 isTextFieldFocused

    • 在键盘输入完成时,通过 focusManager.clearFocus() 和 keyboardController?.hide() 收起键盘。

  4. 占位符文本逻辑

    • 如果输入框内容为空且未聚焦,显示占位符。

    • 根据状态动态调整占位符的显示位置和样式。


http://www.ppmy.cn/ops/151023.html

相关文章

【Linux】Socket编程-TCP构建自己的C++服务器

🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 Socket 编程 TCP 🦋 TCP socket API 详解🦋 多线程远程命令执行🦋 网络版计算器(应用层自定义协议与序列化…

2025第3周 | json-server的基本使用

目录 1. json-server是什么?2. json-server怎么用?2.1 安装2.2 创建db.json2.3 启动服务2.4 查看效果 3. 前端进行模拟交互3.1 创建demo.html3.2 创建demo.js 2025,做想做的事,读想读的书,持续学习,自律生活…

【华为路由/交换机的telnet远程设置】

华为路由/交换机的telnet远程设置 R1:10.1.1.254 R2:10.1.1.1 R3:10.1.1.2 S1:空配 在R2上设置密码为huawei 用R1和R3远程后,在R2上可以查看已经登陆的用户信息 但是这种远程方式的权限非常低,vty用户界…

C语言中char str和char str[]的区别

char* str和char* str[]的区别:C语言中char *str[] 和char *str有什么区别-CSDN博客 char str 和 char str[] 在 C 语言中也有不同的含义和用途,以下是它们的区别: 1. char str 类型:这是一个单一的字符变量。 用途&#xff1a…

5步打造完善的物联网IoT测试体系

前言 智能硬件和软件测试规范涉及概述用于测试系统功能、性能和可靠性的详细说明和标准,以帮助确保系统的可靠性和质量。 请记住,测试是一个迭代过程,需要根据项目不断发展的性质进行调整。 一、物联网测试流程概览 测试基本流程 物联网测试…

怎么在iPhone手机上使用便签进行记录?

宝子们,在这个快节奏的时代,灵感的火花总是一闪而过,待办事项也常常让人应接不暇。好在咱们的 iPhone手机便签超给力,能满足各种记录需求!今天就来给大家分享一下,如何在 iPhone 手机上巧用便签&#xff0c…

NLP DAY1: 文本数据读取

实验介绍 在自然语言处理的第一步,我们要面对的是各种各样以不同形式表现的文本数据,比如,有的是纯 txt 文档,有的是存储在 Excel 中的表格数据,还有的是无法直接打开的 pkl 文件等。刚开始接触编程的同学在这里就犯难…

通过ffmpeg将FLV文件转换为MP4

使用 ffmpeg 将 FLV 文件转换为 MP4 文件是一个常见的操作。ffmpeg 是一个强大的多媒体处理工具,支持多种格式的转换、剪辑、合并等操作。以下是详细的步骤和命令示例,帮助你完成这一任务。 安装 FFmpeg 如果你还没有安装 ffmpeg,可以根据你…