我想用 Jetpack Compose 开发我的下一个 Android 应用程序。我知道它是新的,处于 Alpha 状态。
通过这段代码,我想实现一个登录视图。到目前为止,它一直工作到键盘打开:-(
private val items = listOf(Tab.Home)
private sealed class Tab(@StringRes val resourceId: Int) {
object Home : Tab(R.string.home)
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyApplicationTheme {
Surface(color = MaterialTheme.colors.background) {
Scaffold(
topBar = {
TopAppBar(
title = {
Text(text = "Home")
}
)
},
bottomBar = {
BottomNavigation {
items.forEach { screen ->
BottomNavigationItem(
icon = { Icon(Icons.Filled.Favorite, null) },
label = { Text(stringResource(screen.resourceId)) },
selected = true,
onClick = { /* ... */
}
)
}
}
}
) {
Column(
Modifier.verticalScroll(rememberScrollState()).padding(16.dp)
) {
Text(text = "Lorem ipsum ...")
Spacer(modifier = Modifier.height(32.dp))
Text(text = "Lorem ipsum ...")
Spacer(modifier = Modifier.height(32.dp))
Text(text = "Lorem ipsum ...")
Spacer(modifier = Modifier.height(32.dp))
TextField(
value = "",
label = { Text("Name", color = MaterialTheme.colors.onPrimary.copy(alpha = 0.5f)) },
onValueChange = { /*TODO*/ },
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(16.dp))
TextField(
value = "",
label = { Text("Password", color = MaterialTheme.colors.onPrimary.copy(alpha = 0.5f)) },
onValueChange = { /*TODO*/ },
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(16.dp))
Button(
content = { Text("Login") },
onClick = { /*TODO*/ },
)
}
}
}
}
}
}
}
我使用这个垂直可滚动列,但如果该列的某些部分位于键盘后面,它就不会滚动。
为了修复它,我在清单中添加了 android:windowSoftInputMode="adjustResize|stateHidden"
。
现在我可以滚动列,但在键盘顶部也是 bottomBar。而bottomBar 覆盖了列底部的登录按钮。如果内容足够,bottomBar 也会覆盖按钮,如果键盘关闭,它也会滚动。
现在我有三个问题:
如何在键盘打开但键盘顶部没有bottomBar时使列可滚动?
如何实现自动滚动到焦点文本字段?
如何防止bottomBar覆盖按钮?