Android CustomTextField

打印 上一主题 下一主题

主题 1020|帖子 1020|积分 3060

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x

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

功能概述

本例实现了一个简单的输入框。当输入框得到焦点或输入笔墨时,以下举动发生:

  • 键盘弹出。
  • 输入框上方的占位符文本根据焦点状态和输入内容动态表现或隐藏。
  • 整个布局根据键盘的弹出状态主动调整,制止内容被遮挡。

代码实现

以下是完整代码:
  1. @Composable
  2. fun BoxAlignmentExample() {
  3.     // 设置 Surface 作为背景容器,填充整个屏幕
  4.     Surface(
  5.         modifier = Modifier
  6.             .fillMaxWidth()
  7.             .fillMaxHeight(),
  8.         color = Color(235, 226, 241) // 设置背景颜色
  9.     ) {
  10.         // 定义状态变量管理输入框的文本和焦点状态
  11.         var textValue by remember { mutableStateOf("") } // 输入框的文本内容
  12.         var isTextFieldFocused by remember { mutableStateOf(false) } // 输入框是否聚焦
  13.         // 获取焦点管理器和键盘控制器
  14.         val focusManager = LocalFocusManager.current
  15.         val keyboardController = LocalSoftwareKeyboardController.current
  16.         // 动态计算底部间距,键盘弹出时调整布局
  17.         val bottomPadding by animateDpAsState(
  18.             targetValue = if (isTextFieldFocused || textValue.isNotEmpty()) 50.dp else 0.dp
  19.         )
  20.         // 使用 Column 布局排列内容
  21.         Column(
  22.             modifier = Modifier
  23.                 .fillMaxSize() // 填充父布局
  24.                 .padding(16.dp), // 设置内边距
  25.             horizontalAlignment = Alignment.CenterHorizontally, // 水平居中
  26.             verticalArrangement = Arrangement.Top // 垂直方向从顶部开始排列
  27.         ) {
  28.             // 添加一个占位 Spacer,动态调整内容位置
  29.             Spacer(modifier = Modifier.weight(1f))
  30.             // 使用 Box 包裹输入框和占位符文本
  31.             Box {
  32.                 // 输入框组件
  33.                 TextField(
  34.                     value = textValue, // 输入框的当前文本
  35.                     onValueChange = { newText ->
  36.                         textValue = newText // 更新输入框的文本状态
  37.                     },
  38.                     modifier = Modifier
  39.                         .width(300.dp) // 设置宽度
  40.                         .height(50.dp) // 设置高度
  41.                         .align(Alignment.Center) // 内容居中对齐
  42.                         .border(1.dp, Color.Black, RoundedCornerShape(16.dp)) // 添加圆角边框
  43.                         .clip(RoundedCornerShape(16.dp)) // 裁剪为圆角
  44.                         .onFocusChanged { focusState ->
  45.                             isTextFieldFocused = focusState.isFocused // 更新焦点状态
  46.                         },
  47.                     keyboardOptions = KeyboardOptions.Default.copy(
  48.                         imeAction = ImeAction.Done // 设置键盘操作按钮为 "Done"
  49.                     ),
  50.                     keyboardActions = KeyboardActions(
  51.                         onDone = {
  52.                             isTextFieldFocused = false // 失去焦点
  53.                             focusManager.clearFocus() // 清除焦点
  54.                         }
  55.                     )
  56.                 )
  57.                 // 占位符文本
  58.                 Text(
  59.                     text = " 请输入文本 ",
  60.                     modifier = Modifier
  61.                         .align(Alignment.CenterStart) // 文本居左对齐
  62.                         .padding(
  63.                             start = 20.dp, // 左侧间距
  64.                             top = 0.dp,
  65.                             end = 0.dp,
  66.                             bottom = bottomPadding // 动态调整底部间距
  67.                         )
  68.                         .background(Color(235, 226, 241)), // 设置背景颜色
  69.                     color = Color.Gray // 设置文本颜色
  70.                 )
  71.             }
  72.             // 添加第二个占位 Spacer,确保布局底部有间距
  73.             Spacer(modifier = Modifier.weight(2f))
  74.         }
  75.     }
  76. }
复制代码

核心实现


  • 状态管理 使用 remember 和 mutableStateOf 管理输入框文本内容 (textValue) 和焦点状态 (isTextFieldFocused)。
  • 动画结果 借助 animateDpAsState 动态调整布局底部间距 bottomPadding,为界面变化提供平滑过渡。
  • 输入框的焦点处置惩罚

    • 使用 onFocusChanged 检测输入框的焦点状态,更新 isTextFieldFocused。
    • 在键盘输入完成时,通过 focusManager.clearFocus() 和 keyboardController?.hide() 收起键盘。

  • 占位符文本逻辑

    • 假如输入框内容为空且未聚焦,表现占位符。
    • 根据状态动态调整占位符的表现位置和样式。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表