Кнопка возврата Jetpack Compose Intercept на программной клавиатуреAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Гость
 Кнопка возврата Jetpack Compose Intercept на программной клавиатуре

Сообщение Гость »


Можно ли перехватить кнопку «Назад», когда клавиатура открыта? С помощью EditText это возможно, как в ответе здесь, возможно ли это и для Compose?
У меня есть Search Composable, который вызывает поиск после 300 мс устранения дребезга, и когда я нажимаю кнопку "Назад", нажмите i хотите не только закрыть клавиатуру, но и снять фокус и очистить запрос.

Код: Выделить всё

val focusManager = LocalFocusManager.current
val keyboardController = LocalSoftwareKeyboardController.current

val dispatcher: OnBackPressedDispatcher =
LocalOnBackPressedDispatcherOwner.current!!.onBackPressedDispatcher

val backCallback = remember {
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (!state.focused) {
isEnabled = false
Toast.makeText(context, "Back", Toast.LENGTH_SHORT).show()
dispatcher.onBackPressed()
} else {
println("HomeScreen() Search Back ")
state.query = TextFieldValue("")
state.focused = false
focusManager.clearFocus()
keyboardController?.hide()
}
}
}
}

DisposableEffect(dispatcher) { // dispose/relaunch if dispatcher changes
dispatcher.addCallback(backCallback)
onDispose {
backCallback.remove() // avoid leaks!
}
}
Обратный поиск запускается только после закрытия клавиатуры, как вы можете видеть на рисунке gif. Он выполняет еще один поиск после закрытия клавиатуры, поскольку запрос не пуст.
< p>Обратите внимание: мне не нужно решение, предотвращающее выполнение другого запроса, добавление проверки предыдущего запроса делает это, я хочу перехватить обратное нажатие клавиатуры, поэтому только блок внутри handleOnBackPressed срабатывает при нажатии кнопки «Назад» при открытой клавиатуре, а не после ее закрытия.
[img]https://i.stack.imgur .com/YbV3A.gif[/img]

Код: Выделить всё

SearchState
 — это

Код: Выделить всё

class SearchState(
initialResults: List,
suggestions: List,
searchResults: List,
) {
var query by mutableStateOf(TextFieldValue())
var focused by mutableStateOf(false)
var initialResults by mutableStateOf(initialResults)
var suggestions by mutableStateOf(suggestions)
var searchResults by mutableStateOf(searchResults)

var searching by mutableStateOf(false)
var searchInProgress = searching

val searchDisplay: SearchDisplay
get() = when {
!focused && query.text.isEmpty() -> SearchDisplay.InitialResults
focused && query.text.isEmpty() -> SearchDisplay.Suggestions
searchInProgress -> SearchDisplay.SearchInProgress
!searchInProgress && searchResults.isEmpty() -> SearchDisplay.NoResults
else -> SearchDisplay.Results
}

}
И запрос обрабатывается с помощью

Код: Выделить всё

LaunchedEffect(key1 = Unit) {
snapshotFlow { state.query }
.distinctUntilChanged()
.filter {
it.text.isNotEmpty()
}
.map {
state.searching = false
state.searchInProgress = true
it
}
.debounce(300)
.mapLatest {
state.searching = true
delay(300)
viewModel.getTutorials(it.text)
}
.collect {
state.searchInProgress = false
state.searching = false
state.searchResults = it
}
}


Источник: https://stackoverflow.com/questions/713 ... t-keyboard
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»