TextField 隐藏在键盘后面 - Jetpack Compose

问题描述 投票:0回答:4

我正在使用 Jetpack Compose

TextField
,我发现键盘有一个奇怪的行为。

如果我的文本字段位于屏幕底部并且我打开键盘,则文本字段将保持隐藏在键盘后面。

我也尝试了一些解决方案。

  1. 修改

    android:windowSoftInputMode="adjustPan"
    android:windowSoftInputMode="adjustResize"

  2. 如果我使用 adjustmentPan,有时 TextField 会被键盘抬起,但有时却不会。


这是正在发生的事情的代码和图像。

android textfield android-jetpack-compose
4个回答
3
投票

好吧,我做了一些对我有用的事情,我澄清一下,我只学习了几个星期的作曲,所以不要对我抱有太多期望,我只是做了一些可能不正确的事情,但它对我来说是有用的,可能对任何人都有用。

我所做的是创建一个继承 ComponentActivity() 和所有玩具的主类。

    class Login : ComponentActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
    
            super.onCreate(savedInstanceState)
            setContent {
    
                HealthAtHansClientTheme {

                    Surface(
                        modifier = Modifier.fillMaxSize(),
                        color = MaterialTheme.colors.background
                    ) {
                        LoginLayout()
                    }
                }
            }
        }
    }

之后,我导入了 @Composable 函数,其中包含带有 LoginLayout 的布局,但重要的部分是:

    val scrollState = rememberScrollState()
    Column(
        modifier = Modifier
            .fillMaxWidth()
            .fillMaxHeight()
            .padding(bottom = 100.dp, end = 40.dp, start = 40.dp)
            .verticalScroll(scrollState),
        verticalArrangement = Arrangement.SpaceAround,

    ) {

        Row(
            modifier = Modifier
                .fillMaxWidth()
                .padding(top = 30.dp)
        ) {
            Text(text = "Hola !", style = TextStyle(fontSize = 40.sp))
        }

        Row(horizontalArrangement = Arrangement.Center) {
            Column(
                verticalArrangement = Arrangement.Center,
                horizontalAlignment = Alignment.CenterHorizontally
            ) {


                TextField(
                    maxLines = 1,
                    modifier = Modifier.fillMaxWidth(),
                    value = documentNumber,
                    onValueChange = { documentNumber = it })

                Spacer(modifier = Modifier.height(100.dp))

                TextField(
                    maxLines = 1,
                    modifier = Modifier.fillMaxWidth(),
                    value = privateCode,
                    onValueChange = { privateCode = it })


            }

        }
    }

请注意,文本字段之间的间距为 100,这只是为了测试其功能。

最后通过以下方式在我的主活动中声明 Login 类,因为 Mainactivity 默认情况下出现,但仅用于此测试,其想法只是让他们实现我添加的行

瞧,现在我的 TextField 没有隐藏,我认为如果您有广泛的表单,您可以在清单中创建“活动”并添加行 android:windowSoftInputMode="adjustResize" ,那么这将是非常可行的 这样问题就解决了。

我希望有更多技能和知识的人可以做更有效的事情,目前它对我有用。

如果已经有更有效的解决方案,欢迎评论,如果我的解决方案很愚蠢,我将不胜感激反馈学习。

发生的另一件事是,如果您使用“DefaultPreview”运行模拟器,我尝试的所有方法都不起作用。

如果您在 App 中运行应用程序的模拟,则它可以正常工作。

但我想更进一步,所以我在发布的 apk 版本中编译了这个示例,它应该看起来应该像它应该的那样,并且它可以完美地工作,如图所示。


0
投票

2022 年 10 月更新:以下代码可以解决问题:

class SampleActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        WindowCompat.setDecorFitsSystemWindows(window, false)
        super.onCreate(savedInstanceState)
        setContent {
            LazyColumn(
                contentPadding = WindowInsets.navigationBars.asPaddingValues()
            ) {
                // items
            }
        }
    }
}

设置 Activity 以适应系统窗口并使用 contentPadding 是这里的关键。


0
投票

找到了神奇的解决方案

在清单活动中 – android:windowSoftInputMode="adjustResize"

override fun onCreate(savedInstanceState: Bundle?)
{
    super.onCreate(savedInstanceState)
    WindowCompat.setDecorFitsSystemWindows(window, true)<---add this in activity
    activityNavigator.onCreate(this)
    setContent {
        MainScreen()
    }
}



  Column(
        modifier = Modifier
            verticalScroll(rememberScrollState(), reverseScrolling = true)<-add this in column
            .fillMaxSize()
            .padding(0.dp, navigationBarSize, 0.dp, 0.dp)

    ) {          
  TextField(
            modifier = Modifier
                .fillMaxWidth()
                .padding(8.dp),
            shape = RoundedCornerShape(defaultTextRound),
            colors = TextFieldDefaults.textFieldColors(
                backgroundColor = Purple200,
                focusedIndicatorColor = Color.Transparent,
                unfocusedIndicatorColor = Color.Transparent
            ),
            textStyle = DefaultTextStyle.h1,
            value = noteTitle.value,
            onValueChange = {
                noteTitle.value = it
                normalNoteViewModel?.noteUpdated()
            },
            label = { Text(stringResource(R.string.title)) }
        )

}


0
投票

在清单中添加

   android:windowSoftInputMode="adjustResize"
后 仅将
 Modifier.imePadding()
添加到您的父小部件,例如 LazyColumn

© www.soinside.com 2019 - 2024. All rights reserved.