Javafx 容器中的文本字段-键盘隐藏文本

Javafx 容器中的文本字段-键盘隐藏文本,javafx,gluon-mobile,Javafx,Gluon Mobile,我在底部的容器(VBox)中有一个文本字段。当我选择TextField来输入一些文本时,它会隐藏在键盘(iPhone)后面。我把VBox放在ScrollPane中,但还是一样 我能用某种方法让键盘达到它的高度吗?如何放置键盘未覆盖的文本字段 感谢您的帮助。目前,JavaFX或JavaFXPorts中没有内置方法来获取(本机)iOS软键盘 获取键盘并确定是否有任何节点(如TextField将被其覆盖)的解决方案需要使用Glion Charm Down中可用的服务,但目前还没有此类键盘服务 基于本机

我在底部的容器(VBox)中有一个文本字段。当我选择TextField来输入一些文本时,它会隐藏在键盘(iPhone)后面。我把VBox放在ScrollPane中,但还是一样

我能用某种方法让键盘达到它的高度吗?如何放置键盘未覆盖的文本字段


感谢您的帮助。

目前,JavaFX或JavaFXPorts中没有内置方法来获取(本机)iOS软键盘

获取键盘并确定是否有任何节点(如
TextField
将被其覆盖)的解决方案需要使用Glion Charm Down中可用的
服务
,但目前还没有此类
键盘服务

基于本机解决方案,例如,当显示或隐藏键盘时,很容易收到通知。因此,我们可以利用这些侦听器将高度值发送回JavaFX层

因此,让我们创建
键盘服务
,同时考虑如何在Charm Down库中创建这些服务

因为这有点超出范围,所以我用所需的文件创建了它

请按照以下步骤进行操作:

  • 创建胶子项目
  • 使用IDE的最新版本的Glion插件创建Glion项目(单视图)

  • 添加键盘服务接口
  • 添加包
    com.gloonhq.charm.down.plugins
    。添加类
    KeyboardService
    ()和
    KeyboardServiceFactory
    ()

  • iOS实施
  • 在iOS包下添加服务的iOS实现
    IOSKeyboardService
    ()

  • 本机代码
  • /src/ios
    下创建一个
    native
    文件夹,并添加
    Keyboard.h
    ()文件:

  • 构建本机库
  • 在带有最新版本XCode的Mac上,您可以构建本机库
    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()));
    });