我正在制作一个计算器来学习写作,所以我把自己的数字按钮放在屏幕上,我想防止软键盘出现。
这是我的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;
}
}
使用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)
}
)
}
我创建了一个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的交互
我已经测试了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中有效):