我正在使用 Jetpack Compose
TextField
,我发现键盘有一个奇怪的行为。
如果我的文本字段位于屏幕底部并且我打开键盘,则文本字段将保持隐藏在键盘后面。
我也尝试了一些解决方案。
修改
android:windowSoftInputMode="adjustPan"
和 android:windowSoftInputMode="adjustResize"
如果我使用 adjustmentPan,有时 TextField 会被键盘抬起,但有时却不会。
这是正在发生的事情的代码和图像。
好吧,我做了一些对我有用的事情,我澄清一下,我只学习了几个星期的作曲,所以不要对我抱有太多期望,我只是做了一些可能不正确的事情,但它对我来说是有用的,可能对任何人都有用。
我所做的是创建一个继承 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 版本中编译了这个示例,它应该看起来应该像它应该的那样,并且它可以完美地工作,如图所示。
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 是这里的关键。
找到了神奇的解决方案
在清单活动中 – 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)) }
)
}
在清单中添加
android:windowSoftInputMode="adjustResize"
后
仅将 Modifier.imePadding()
添加到您的父小部件,例如 LazyColumn