相关疑难解决方法(0)

如何检测软件键盘在Android设备上是否可见?

Android中是否有办法检测屏幕上是否显示软件(又称"软")键盘?

keyboard android

221
推荐指数
15
解决办法
24万
查看次数

Jetpack Compose - 滚动到列中的可组合焦点

我有这样的用户界面:

val scrollState = rememberScrollState()
        Column(
            modifier = Modifier
                .fillMaxSize(1F)
                .padding(horizontal = 16.dp)
                .verticalScroll(scrollState)
        ) {

            TextField(...)
 // multiple textfields
             TextField(
                        //...
                        modifier = Modifier.focusOrder(countryFocus).onFocusChanged {
                            if(it == FocusState.Active) {
                               // scroll to this textfield
                            }
                        },
                    )
         }
Run Code Online (Sandbox Code Playgroud)

我在此列中有多个 TextFields,当其中一个聚焦时,我想将 Column 滚动到它。scrollState 中有一个方法,scrollState.smoothScrollTo(0f)但我不知道如何获得聚焦的 TextField 位置。

更新:

看来我找到了一个可行的解决方案。我用过onGloballyPositioned并且有效。但我不确定这是否是解决此问题的最佳方法。

var scrollToPosition = 0.0F

TextField(
   modifier = Modifier
    .focusOrder(countryFocus)
    .onGloballyPositioned { coordinates ->
        scrollToPosition = scrollState.value + coordinates.positionInRoot().y
    }
    .onFocusChanged {
    if (it == FocusState.Active) {
        scope.launch { …
Run Code Online (Sandbox Code Playgroud)

android-jetpack-compose android-jetpack-compose-text

8
推荐指数
2
解决办法
1427
查看次数

在 Jetpack Compose 中的 Scaffold 底部栏上显示键盘并应用适当的插入填充

Scaffold在主屏幕上使用了一个bottomBar在应用程序的每个屏幕中都可见的固定屏幕,并且我将 的 应用于innerPaddingScaffold内容。

我希望键盘出现在 之上bottomBar,为此我将imePadding()only应用于Scaffold应用于的内容。

但是,当键盘打开时,ScaffoldinnerPadingimePadding()都会应用于内容填充。

我尝试过伴奏插入迁移,但并不幸运。

无论如何,我可以阻止它并仅应用其中之一吗?

这是我的一段代码:

Scaffold(
    topBar = { },
    bottomBar = { },
    modifier = Modifier
        .systemBarsPadding()
) { innerPadding ->
    Content(
        modifier = Modifier
            .padding(innerPadding)
            .imePadding()
    )
}
Run Code Online (Sandbox Code Playgroud)

这是结果:

在此输入图像描述

对于现在已弃用的伴奏插图,我使用了以下解决方案:

val isImeVisible = LocalWindowInsets.current.ime.isVisible
val contentPadding = remember(isImeVisible) {
    if (isImeVisible) PaddingValues(top = innerPadding.calculateTopPadding()) else innerPadding
}
Run Code Online (Sandbox Code Playgroud)

windowinsets android-jetpack-compose jetpack-compose-accompanist

8
推荐指数
1
解决办法
5144
查看次数

如何在可见键盘顶部显示可组合项?

由于我们有不同的屏幕尺寸和分辨率,我想在展开的键盘顶部放置一个可组合项:

在此输入图像描述

键盘(见上图)是可见的,我想显示另一个可组合项(红色方块),例如消息几秒钟。

使用 Jetpack Compose 定位红色可组合项的简单方法是什么?

android-jetpack android-jetpack-compose

7
推荐指数
2
解决办法
2556
查看次数

观察软键盘的可见性,打开/关闭 Jetpack Compose

我正在尝试积极观察软键盘的可见性,目前,我正在尝试使用

WindowInsets.isImeVisible
Run Code Online (Sandbox Code Playgroud)

但我似乎无法观察到它的状态变化。有人提到使用

ViewCompat.setOnApplyWindowInsetsListener()
Run Code Online (Sandbox Code Playgroud)

但我不太明白如何实现这个来观察键盘的可见性。

我已经设法使用

WindowInsets.isImeVisible
Run Code Online (Sandbox Code Playgroud)

但是,它仅适用于我导航到该页面并且键盘自动打开时。

android android-softkeyboard kotlin android-jetpack-compose compose-recomposition

5
推荐指数
1
解决办法
1350
查看次数

Jetpack Compose 拦截软键盘的后退按钮

键盘打开时是否可以拦截后退按钮?使用 EditText 可以,如此处的答案所示,Compose 也可以吗?

我有一个Search可组合项,它在 300 毫秒去抖后调用搜索,当我单击后退按钮时,我不仅想要关闭键盘,还想要删除焦点并清除查询。

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! …
Run Code Online (Sandbox Code Playgroud)

android android-jetpack-compose

4
推荐指数
1
解决办法
1889
查看次数

喷气背包中的状态持有者组成

我正在State学习jetpack compose。我发现国家持有者是真相的来源。所以创建了我的一些数据,如果我在这里做错了,你们可以指导我吗?

PairViewModel.kt

class PairViewModel : ViewModel() {

    var isBluetoothEnabled = mutableStateOf(false)
        private set

    fun onBluetoothEnable(value: Boolean) {
        isBluetoothEnabled.value = value
    }
}
Run Code Online (Sandbox Code Playgroud)

配对屏幕.kt

class PairScreenState(context: Context, viewModel: PairViewModel) {

    private val bluetoothManager: BluetoothManager = context.getSystemService(BluetoothManager::class.java)
    private val bluetoothAdapter: BluetoothAdapter by lazy {
        bluetoothManager.adapter
    }

    init {
        viewModel.onBluetoothEnable(bluetoothAdapter.isEnabled)
    }

    fun checkBluetoothStatus(bluetoothStatus: MutableState<Boolean>): BroadcastReceiver {
        return object : BroadcastReceiver() {
            override fun onReceive(context: Context?, intent: Intent?) {
                if (intent?.action == BluetoothAdapter.ACTION_STATE_CHANGED) {
                    when (intent.getIntExtra(
                        BluetoothAdapter.EXTRA_STATE,
                        BluetoothAdapter.ERROR
                    )) …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-architecture-components android-jetpack android-jetpack-compose

4
推荐指数
1
解决办法
2532
查看次数