Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 防止键盘出现在Jetpack Compose应用程序中_Android_Android Jetpack Compose - Fatal编程技术网

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

Android 防止键盘出现在Jetpack Compose应用程序中,android,android-jetpack-compose,Android,Android Jetpack Compose,我正在制作一个计算器来学习作曲,所以我把自己的数字按钮放在屏幕上,我想防止出现软键盘 这是我的回购协议: 我注意到在TextFieldImpl.kt中有一个显示键盘的修改器,因此我尝试克隆代码并删除以下行:keyboardController.value?.showSoftwareKeyboard()我知道这样复制代码不是一个好主意,但我想尝试一下,但没有成功。正如您在下面的原始代码中看到的,有一个TODO说明它应该由BaseTextField处理,但我查看了它的代码,没有找到它显示或隐藏键盘的

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

这是我的回购协议:

我注意到在TextFieldImpl.kt中有一个显示键盘的修改器,因此我尝试克隆代码并删除以下行:
keyboardController.value?.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等效的视图:

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

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

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

ReadonlyTextField的实现
@Composable
有趣的ReadonlyTextField(
值:TextFieldValue,
onValueChange:(TextFieldValue)->单位,
修饰符:修饰符=修饰符,
onClick:()->单位,
标签:@Composable()->Unit
) {
盒子{
文本字段(
值=值,
onValueChange=onValueChange,
修饰符=修饰符,
标签
)
盒子(
修饰语=修饰语
.matchParentSize()
.alpha(0f)
.可点击(onClick=onClick),
)
}
}
ReadonlyTextField的用法
@Composable
趣味应用程序(){
val textState=记住{mutableStateOf(TextFieldValue())}
纵队{
ReadonlyTextField(
value=textState.value,
onValueChange={textState.value=it},
onClick={
//自定义点击处理(例如打开对话框)
},
标签={
文本(Text=“无键盘输入”)
}
)
}
}
在我的中篇文章中可以找到完整的集成示例:

学分也会转到以下答案:

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

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

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

ReadonlyTextField的实现
@Composable
有趣的ReadonlyTextField(
值:TextFieldValue,
onValueChange:(TextFieldValue)->单位,
修饰符:修饰符=修饰符,
onClick:()->单位,
标签:@Composable()->Unit
) {
盒子{
文本字段(
值=值,
onValueChange=onValueChange,
修饰符=修饰符,
标签
)
盒子(
修饰语=修饰语
.matchParentSize()
.alpha(0f)
.可点击(onClick=onClick),
)
}
}
ReadonlyTextField的用法
@Composable
趣味应用程序(){
val textState=记住{mutableStateOf(TextFieldValue())}
纵队{
ReadonlyTextField(
value=textState.value,
onValueChange={textState.value=it},
onClick={
//自定义点击处理(例如打开对话框)
},
标签={
文本(Text=“无键盘输入”)
}
)
}
}
在我的中篇文章中可以找到完整的集成示例:

学分也会转到以下答案:

我从未用过镇静,但我很感兴趣。我看了几场演讲,如果我听懂了的话,难道不是要用
NoImeEditText
作为
@Composable
方法吗?我的意思是在自定义可组合视图中。据我所知,可组合不是建立在传统视图之上的,它是一个全新的UI工具包,因此我无法基于传统视图创建可组合函数。哦,我明白了,我的错。如果不希望用户直接在TextField()中输入,为什么要使用TextField()?可以用Text()替换TextField()吗?我希望用户能够像通常在TextField中一样使用选择,除了视觉效果之外,基本上我希望TextField提供的所有东西,除了focus上的软键盘打开我自己曾经使用过的compose,但我很感兴趣。我看了几场演讲,如果我听懂了的话,难道不是要用
NoImeEditText
作为
@Composable
方法吗?我的意思是在自定义可组合视图中。据我所知,可组合不是建立在传统视图之上的,它是一个全新的UI工具包,因此我无法基于传统视图创建可组合函数。哦,我明白了,我的错。如果不希望用户直接在TextField()中输入,为什么要使用TextField()?可以用Text()替换TextField()吗?我希望用户能够像通常在TextField中一样使用选择,除了视觉效果之外,基本上我希望TextField提供的所有东西,除了在Focuss上打开软键盘外,不久前我为此打开了一个问题,撰写团队回答我说他们正在更改整个focus API,其中包括一种不显示键盘和文本输入焦点的方法,但谢谢你的回答。不久前,我为此打开了一个问题,撰写团队回答我说,他们正在更改整个焦点API,其中将包括一种不显示键盘文本的方法
public class NoImeEditText extends EditText {
    public NoImeEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @Override
    public boolean onCheckIsTextEditor() {
        return false;
    }
}