Javafx 容器中的文本字段-键盘隐藏文本
我在底部的容器(VBox)中有一个文本字段。当我选择TextField来输入一些文本时,它会隐藏在键盘(iPhone)后面。我把VBox放在ScrollPane中,但还是一样 我能用某种方法让键盘达到它的高度吗?如何放置键盘未覆盖的文本字段Javafx 容器中的文本字段-键盘隐藏文本,javafx,gluon-mobile,Javafx,Gluon Mobile,我在底部的容器(VBox)中有一个文本字段。当我选择TextField来输入一些文本时,它会隐藏在键盘(iPhone)后面。我把VBox放在ScrollPane中,但还是一样 我能用某种方法让键盘达到它的高度吗?如何放置键盘未覆盖的文本字段 感谢您的帮助。目前,JavaFX或JavaFXPorts中没有内置方法来获取(本机)iOS软键盘 获取键盘并确定是否有任何节点(如TextField将被其覆盖)的解决方案需要使用Glion Charm Down中可用的服务,但目前还没有此类键盘服务 基于本机
感谢您的帮助。目前,JavaFX或JavaFXPorts中没有内置方法来获取(本机)iOS软键盘 获取键盘并确定是否有任何节点(如
TextField
将被其覆盖)的解决方案需要使用Glion Charm Down中可用的服务
,但目前还没有此类键盘服务
基于本机解决方案,例如,当显示或隐藏键盘时,很容易收到通知。因此,我们可以利用这些侦听器将高度值发送回JavaFX层
因此,让我们创建键盘服务
,同时考虑如何在Charm Down库中创建这些服务
因为这有点超出范围,所以我用所需的文件创建了它
请按照以下步骤进行操作:
com.gloonhq.charm.down.plugins
。添加类KeyboardService
()和KeyboardServiceFactory
()
IOSKeyboardService
()
/src/ios
下创建一个native
文件夹,并添加Keyboard.h
()文件:
libKeyboard.a
。为此,您需要将xcodebuild
任务添加到项目()的build.gradle
文件中。它基于从Charm Down开始的ios build.gradle
task xcodebuild {
doLast {
xcodebuildIOS("$project.buildDir","$project.projectDir", "Keyboard")
}
}
保存项目,并从项目根目录下的命令行运行/gradlew clean build xcodebuild
如果一切就绪,您应该在build/native
下找到libKeyboard.a
。复制文件,在src/ios
下创建文件夹jniLibs
,然后粘贴到那里
TextField
添加到BasicView
,并将对齐方式更改为底部居中
VBox controls = new VBox(15.0, label, button, new TextField());
controls.setAlignment(Pos.BOTTOM_CENTER);
实施服务:
Services.get(KeyboardService.class).ifPresent(keyboard -> {
keyboard.visibleHeightProperty().addListener((obs, ov, nv) ->
setTranslateY(-nv.doubleValue()));
});
部署并运行
你应该把一切都准备好。插上iPhone/iPad,然后运行/gradlew--info launchIOSDevice
当文本字段获得焦点时,将显示软键盘,并转换视图,因此文本字段完全可见:
希望这项服务将包括在魅力下降在某个时候。但这也是如何添加自定义服务的一个很好的示例。还要注意的是,Charm Down项目是开源的,所以任何贡献都是好的 太棒了!非常感谢。嘿,何塞。我今天才抽出时间来实现上面的插件。描述完美,一切正常。我在文本字段的右边有一个“发送”按钮。对于上述解决方案,我必须按“发送”两次。第一次移除键盘时。。然后我必须再次点击按钮,让它完成他的工作。你知道我需要更改什么吗?这样当键盘处于活动状态时,第一次按下按钮就会被触发。谢谢。用按钮.setOnMouseClicked()
替换按钮.setOnMouseClicked()
,应该可以。不知何故,当键盘被关闭且未触发操作时,fire()
事件被消耗。这也不起作用。但它给了我正确的暗示。setOnTouchPressed正确触发。再次感谢你!嗨,何塞。部署到iOs很好。现在我已经安装了Android,但是没有在那里部署它。我是否需要取消对上述所有内容的注释并从src文件夹中删除lib?我现在正纠结于安装失败、没有匹配ABIS的错误,这似乎表明我的架构是错误的。。有什么想法吗?
static int KeyboardInited = 0;
jclass mat_jKeyboardServiceClass;
jmethodID mat_jKeyboardService_notifyKeyboard = 0;
Keyboard *_keyboard;
CGFloat currentKeyboardHeight = 0.0f;
JNIEXPORT void JNICALL Java_com_gluonhq_charm_down_plugins_ios_IOSKeyboardService_initKeyboard
(JNIEnv *env, jclass jClass)
{
if (KeyboardInited)
{
return;
}
KeyboardInited = 1;
mat_jKeyboardServiceClass = (*env)->NewGlobalRef(env, (*env)->FindClass(env, "com/gluonhq/charm/down/plugins/ios/IOSKeyboardService"));
mat_jKeyboardService_notifyKeyboard = (*env)->GetMethodID(env, mat_jKeyboardServiceClass, "notifyKeyboard", "(F)V");
GLASS_CHECK_EXCEPTION(env);
_keyboard = [[Keyboard alloc] init];
}
void sendKeyboard() {
GET_MAIN_JENV;
(*env)->CallVoidMethod(env, mat_jKeyboardServiceClass, mat_jKeyboardService_notifyKeyboard, currentKeyboardHeight);
}
@implementation Keyboard
- (void) startObserver
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}
- (void) stopObserver
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}
- (void)keyboardWillShow:(NSNotification*)notification {
NSDictionary *info = [notification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
currentKeyboardHeight = kbSize.height;
sendKeyboard();
}
- (void)keyboardWillHide:(NSNotification*)notification {
currentKeyboardHeight = 0.0f;
sendKeyboard();
}
@end
task xcodebuild {
doLast {
xcodebuildIOS("$project.buildDir","$project.projectDir", "Keyboard")
}
}
VBox controls = new VBox(15.0, label, button, new TextField());
controls.setAlignment(Pos.BOTTOM_CENTER);
Services.get(KeyboardService.class).ifPresent(keyboard -> {
keyboard.visibleHeightProperty().addListener((obs, ov, nv) ->
setTranslateY(-nv.doubleValue()));
});