当前位置: 首页 > 知识库问答 >
问题:

防止键盘出现在Jetpack Compose应用程序中

秦浩漫
2023-03-14

我正在制作一个计算器来学习写作,所以我把自己的数字按钮放在屏幕上,我想防止软键盘出现。

这是我的repo:https://github.com/vitor-ramos/CalculadorCompose

我在TextFieldImpl中注意到。kt有一个显示键盘的修改器,所以我试图克隆代码并删除这行:keyboardController。价值showSoftwareKeyboard()我知道这样复制代码不是个好主意,但我想尝试一下,结果失败了。正如您在下面的原始代码中看到的,有一个TODO说明它应该由BaseTextField处理,但我查看了它的代码,没有找到它显示或隐藏键盘的位置。

val textFieldModifier = modifier
    .focusRequester(focusRequester)
    .focusObserver { isFocused = it.isFocused }
    .clickable(indication = null) {
        focusRequester.requestFocus()
        // TODO(b/163109449): Showing and hiding keyboard should be handled by BaseTextField.
        //  The requestFocus() call here should be enough to trigger the software keyboard.
        //  Investiate why this is needed here. If it is really needed, instead of doing
        //  this in the onClick callback, we should move this logic to the focusObserver
        //  so that it can show or hide the keyboard based on the focus state.
        keyboardController.value?.showSoftwareKeyboard()
    }

我在这个问题中发现,通过视图,我可以扩展EditText并更改功能,但我还没有找到Compose: Android的等价物:完全禁用软键盘EditTexts

public class NoImeEditText extends EditText {
    public NoImeEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @Override
    public boolean onCheckIsTextEditor() {
        return false;
    }
}

共有3个答案

单于高逸
2023-03-14

使用ReadonlyTextField无法定位光标。因此,在撰写AndroidView中添加了包装的EditText

@Composable
fun NoKeyboardTextField(
    modifier: Modifier,
    text: String,
    textColor: Int
) {
    AndroidView(
        modifier = modifier,
        factory = { context ->
            AppCompatEditText(context).apply {
                isFocusable = true
                isFocusableInTouchMode = true
                showSoftInputOnFocus = false
            }
        },
        update = { view ->
            view.setText(text)
            view.setTextColor(textColor)
            view.setSelection(text.length)
        }
    )
}
葛意远
2023-03-14

我创建了一个ComposableReadonlyTextField,它在文本字段前面放置了一个不可见的框。该框与文本字段大小相同。

使用该解决方法,您无法再聚焦文本字段,因此不会出现键盘。为了应用自定义单击处理,我在Box-Modifier中添加了onClick

这不是一个真正干净的解决方案,而是一个很好的解决方法。

@Composable
fun ReadonlyTextField(
    value: TextFieldValue,
    onValueChange: (TextFieldValue) -> Unit,
    modifier: Modifier = Modifier,
    onClick: () -> Unit,
    label: @Composable () -> Unit
) {

    Box {
        TextField(
            value = value,
            onValueChange = onValueChange,
            modifier = modifier,
            label = label
        )

        Box(
            modifier = Modifier
                .matchParentSize()
                .alpha(0f)
                .clickable(onClick = onClick),
        )
    }
}
@Composable
fun App() {
    val textState = remember { mutableStateOf(TextFieldValue()) }

    Column {
        ReadonlyTextField(
            value = textState.value,
            onValueChange = { textState.value = it },
            onClick = {
                // custom click handling (e.g. open dialog)
            },
            label = {
                Text(text = "Keyboardless Input")
            }
        )
    }
}

在我的中间帖子中可以找到一个完整的综合示例:https://caelis.medium.com/jetpack-compose-datepicker-textfield-39808e42646a

学分也归到这个stackoverflow答案:Jetpack Compose:禁用与TextField的交互

姚智
2023-03-14

我已经测试了Arun Pdiyan解决方案,并与null LocalTextInputService一起工作(在我的情况下,我从设备附加的条形码阅读器读取数据)

 CompositionLocalProvider(
        LocalTextInputService provides null
    ) {
        TextField(
            value = barcodeReaderService.readedText.value,
            onValueChange = { textState.value=it },
            label = { Text("The Label") }
        )
    }
 类似资料:
  • 如果我创建了一个简单的应用程序,其中有一个活动,其中包含一个EditText,我会这样做 这样可以防止键盘出现(在我的Android5.0和7.1测试中)。这就是我想要的,正如这些问题所要求的: 从EditText禁用软键盘,但仍允许复制/粘贴 如何为特定活动禁用Android软键盘 Android:在所有编辑文本中禁用软键盘 如何在编辑文本时禁用键盘弹出 禁用编辑文本上的键盘 源代码是 但是我看

  • 我的第一个标签上有一条编辑文本。当然,当我触摸编辑文本时会出现软键盘。但当我访问第二个选项卡时,这意味着第二个选项卡活动,软键盘始终出现在我的第一个选项卡上,并且不会消失,即使我的第二个选项卡活动上没有EditText。 我想防止软键盘出现,当我访问我的第二个选项卡。 我如何解决这些问题? 这是我的清单文件

  • 我从C#开始,第一个项目是做计算器。我想为我的GUI提供一个键盘处理程序,它可以执行与我之前所做的按钮处理程序相同的操作。问题是当我进入“回车”键时。这就是我的空虚: 问题是,如果我按下enter键,它会抛出处理程序事件,但它也会按下按钮,就像我单击它一样。这是一张图片: 知道吗?谢谢:)

  • 问题内容: 我有一个输入活动。初始化活动后,将显示Android键盘。在用户集中输入之前,键盘如何保持隐藏状态? 问题答案: 我认为以下可能有效 我以前已经将它用于此类事情。

  • 问题内容: 我正在尝试为新的Apple编程语言Swift的命令行应用程序获取键盘输入。 我扫描了文档无济于事。 有任何想法吗? 问题答案: 我设法弄清楚了,而没有陷入C: 我的解决方案如下: 较新的Xcode版本需要显式的类型转换(在Xcode 6.4中有效):