我有一个问题,我无法解决......
我有一个活动,用户可以添加一些信息,例如姓名等。它是用 Kotlin 和 Jetpack Compose 库编写的。其中一个字段是 AutoCompleteTextView,系统从房间数据库获取信息,并将这些内容显示在文本字段下方的列表中。我的问题是这个列表总是显示在键盘后面。 (如下图所示)。如何管理列表显示/滚动到视图中? (“InputFields”位于可滚动列内)。当在文本字段上方显示列表时,还有另一个问题:我失去了文本字段的焦点......
我的代码:
自动完成视图:
@Composable
fun <T> AutoCompleteTextView(
modifier: Modifier,
value: String,
label: String,
onValueChanged: (String) -> Unit = {},
predictions: List<T>,
clearVisible: Boolean = true,
keyBoardAction: ImeAction = ImeAction.Search,
onActionClick: () -> Unit = {},
onClearClick: () -> Unit = {},
onItemClick: (T) -> Unit = {},
itemContent: @Composable (T) -> Unit = {},
) {
val view = LocalView.current
val lazyListState = rememberLazyListState()
var showClearButton by remember { mutableStateOf(false) }
val focusRequester = remember { FocusRequester() }
LazyColumn(
state = lazyListState,
modifier = modifier.heightIn(max = TextFieldDefaults.MinHeight * 6)
) {
item {
OutlinedTextField(
modifier = modifier
.onFocusChanged { focusState ->
showClearButton = clearVisible and focusState.isFocused
}
.focusRequester(focusRequester),
value = value,
onValueChange = {
onValueChanged.invoke(it)
focusRequester.requestFocus()
},
label = { Text(text = label) },
singleLine = true,
trailingIcon = {
if (showClearButton) {
IconButton(painterResource(R.mipmap.ic_close),
stringResource(R.string.clear)) {
onClearClick()
}
}
},
keyboardActions = KeyboardActions(
onSearch = { onActionClick() },
onDone = { onActionClick() },
onGo = { onActionClick() },
onNext = { onActionClick() },
onPrevious = { onActionClick() },
onSend = { onActionClick() },
),
keyboardOptions = KeyboardOptions(
imeAction = keyBoardAction,
keyboardType = KeyboardType.Text
),
shape = RoundedCornerShape(10.dp),
colors = TextFieldDefaults.colors(
focusedIndicatorColor = MaterialTheme.colorScheme.primaryContainer,
unfocusedIndicatorColor =
MaterialTheme.colorScheme.secondaryContainer,
focusedContainerColor = Color.Transparent,
unfocusedContainerColor = Color.Transparent,
errorContainerColor = Color.Transparent
)
)
}
if (predictions.isNotEmpty()) {
itemsIndexed(predictions) { _, element ->
Row(
Modifier
.padding(5.dp)
.fillMaxWidth()
.clickable {
view.clearFocus()
onItemClick(element)
}
) {
itemContent(element)
}
}
}
}
}
活动:
Box(
modifier = Modifier
.fillMaxWidth()
.padding(5.dp)
) {
Surface(
modifier = Modifier
.fillMaxWidth()
.padding(top = 10.dp),
shape = RoundedCornerShape(10.dp),
border = BorderStroke(1.dp,
MaterialTheme.colorScheme.secondaryContainer)
) {
Column {
Row(modifier = Modifier.wrapContentWidth()) {
Image(
modifier = Modifier
.verticalGradient()
.padding(start = 15.dp, top = 20.dp, end =
10.dp)
.size(24.dp),
painter = painterResource(R.mipmap.ic_dice),
contentDescription =
stringResource(R.string.genres)
)
Column(modifier = Modifier.wrapContentSize()) {
FlowRow(
modifier = Modifier
.wrapContentSize()
.padding(vertical = 6.dp),
horizontalArrangement =
Arrangement.spacedBy(5.dp, Start),
verticalArrangement = Arrangement.Top
) {
for (genre in genres) {
FilterChip(
modifier = Modifier.padding(horizontal
= 5.dp),
onClick = { genres.remove(genre) },
selected = true,
trailingIcon = {
Image(
modifier = Modifier
.verticalGradient()
.size(15.dp),
painter =
painterResource(R.mipmap.ic_close),
contentDescription =
stringResource(R.string.delete)
)
},
label = {
Text(genre.name)
}
)
}
}
Box(
Modifier
.fillMaxWidth()
.padding(horizontal = 10.dp)
.height(1.dp)
.background(MaterialTheme.colorScheme.secondaryContainer)
)
AutoCompleteTextView(modifier =
Modifier.padding(5.dp),
value = selectedGenreName,
label = "Genre",
onValueChanged = {
selectedGenreName = it
if (it.isNotEmpty()) {
getGenres(it)
} else {
filteredGenres.clear()
}
},
predictions = filteredGenres,
keyBoardAction = ImeAction.Done,
clearVisible = false,
onActionClick = {
val first = filteredGenres.stream().filter
{ it.name == selectedGenreName }.findFirst()
if (first.isPresent) {
genres.add(first.get())
} else {
genres.add(Genre().apply { name =
selectedGenreName })
}
selectedGenreName = ""
filteredGenres.clear()
},
onItemClick = {
genres.add(it)
selectedGenreName = ""
filteredGenres.clear()
}) {
Text(text = it.name)
}
}
}
}
}
Surface(
modifier = Modifier.padding(start = 15.dp),
color = MaterialTheme.colorScheme.background
) {
Text(
modifier = Modifier
.padding(horizontal = 5.dp)
.horizontalGradient(),
text = stringResource(R.string.genres),
fontSize = 14.sp
)
}
}
您可以将此行
android:windowSoftInputMode="adjustResize"
添加到清单文件上保存此屏幕的活动标记中,键盘会将屏幕向上推