You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose中Samsung Keyboard键盘弹出动画失效问题问询

Jetpack Compose 三星S25 Ultra+三星键盘下TextField键盘弹出无动画问题

问题背景

  • 仅在Samsung Galaxy S25 Ultra + Samsung Keyboard组合下出现异常:点击TextField时,键盘关闭动画正常,但弹出动画完全缺失
  • 相同代码在Pixel 9 Pro XL模拟器等其他设备运行正常,其他应用的三星键盘动画也正常,排除全局设置问题
  • 切换至Microsoft SwiftKey等第三方键盘后功能恢复正常,判定为三星键盘与Jetpack Compose的适配Bug

最小复现代码

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.safeDrawingPadding
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import com.test.ui.theme.TestTheme

class MainActivity : ComponentActivity() {
    @OptIn(ExperimentalLayoutApi::class)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            TestTheme {
                Column(Modifier.safeDrawingPadding()) {
                    var text by remember { mutableStateOf("") }
                    TextField(
                        value = text,
                        onValueChange = { text = it },
                        modifier = Modifier.safeDrawingPadding()
                    )
                }
            }
        }
    }
}

已尝试无效的方案

  • 使用imePadding()、navigationBarsPadding()、imeNestedScroll()修饰符

可行修复方案

1. 手动控制键盘显示逻辑

通过LocalSoftwareKeyboardController手动触发键盘显示,绕过系统默认的动画触发逻辑:

import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.layout.pointerInput
import androidx.compose.material3.LocalSoftwareKeyboardController
import androidx.compose.material3.TextField

@Composable
fun FixedTextField() {
    val keyboardController = LocalSoftwareKeyboardController.current
    var text by remember { mutableStateOf("") }
    
    TextField(
        value = text,
        onValueChange = { text = it },
        modifier = Modifier
            .safeDrawingPadding()
            .pointerInput(Unit) {
                detectTapGestures(onTap = {
                    keyboardController?.show()
                })
            }
    )
}

2. 重置三星键盘动画设置

引导用户执行以下操作:

  • 打开三星键盘设置 → 高级功能 → 动画效果
  • 关闭动画效果后重新开启,部分用户反馈此操作可临时修复问题

3. 升级依赖版本

这类适配Bug通常会在后续版本中修复,建议:

  • 将Jetpack Compose Material3升级至最新稳定版
  • 提醒用户将三星键盘更新至应用商店的最新版本

4. 使用自定义TextField组件

若上述方法无效,可尝试自定义TextField实现,避免依赖系统默认逻辑:

import androidx.compose.foundation.border
import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.pointerInput
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.BasicTextField
import androidx.compose.material3.LocalSoftwareKeyboardController
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp

@Composable
fun CustomTextField(
    text: String,
    onTextChange: (String) -> Unit,
    hint: String = "输入内容"
) {
    var isFocused by remember { mutableStateOf(false) }
    val keyboardController = LocalSoftwareKeyboardController.current

    Box(
        modifier = Modifier
            .border(
                width = 1.dp,
                color = if (isFocused) MaterialTheme.colorScheme.primary else Color.Gray,
                shape = RoundedCornerShape(4.dp)
            )
            .padding(horizontal = 16.dp, vertical = 12.dp)
            .pointerInput(Unit) {
                detectTapGestures(onTap = {
                    isFocused = true
                    keyboardController?.show()
                })
            }
    ) {
        BasicTextField(
            value = text,
            onValueChange = onTextChange,
            modifier = Modifier.fillMaxWidth(),
            onFocusChanged = { state ->
                isFocused = state.isFocused
                if (!state.isFocused) {
                    keyboardController?.hide()
                }
            }
        )

        if (!isFocused && text.isEmpty()) {
            Text(text = hint, color = Color.Gray)
        }
    }
}

内容的提问来源于stack exchange,提问作者denis0001-dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 09:23:14