AutoCompleteTextField 列表不可见(在软键盘后面绘制)

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

我有一个问题,我无法解决......

我有一个活动,用户可以添加一些信息,例如姓名等。它是用 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 kotlin android-jetpack-compose autocompletetextview
1个回答
0
投票

您可以将此行

android:windowSoftInputMode="adjustResize"
添加到清单文件上保存此屏幕的活动标记中,键盘会将屏幕向上推

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