2016-11-25 1 views
3

Ich habe ein TextField in einem Container (VBox) in der Unterseite. Wenn ich TextField zum Eingeben von Text wähle, wird es hinter der Tastatur (iPhone) versteckt. Ich stelle die VBox in ScrollPane, aber immer noch das gleiche.TextField in einem Container - Tastatur versteckt Text

kann ich die Tastatur irgendwie seine Höhe zu bekommen? Wie platziere ich TextFields, die nicht von der Tastatur abgedeckt sind?

Vielen Dank für Ihre Hilfe.

Antwort

3

In diesem Moment gibt es keine integrierte Methode in JavaFX oder JavaFXPorts die (native) iOS Soft-Tastatur zu bekommen.

Die Lösung, die Tastatur zu bekommen und herauszufinden, ob irgendein Knoten, wie ein TextField durch sie gedeckt wird, ein Service von denen in der Gluon Charm Down-library, aber jetzt erfordern würde, ist es nicht so KeyboardService.

Basierend auf nativen Lösungen wie this, ist es einfach, eine Benachrichtigung zu erhalten, wenn die Tastatur angezeigt oder ausgeblendet wird. Wir könnten also diese Listener verwenden und den Höhenwert zurück an die JavaFX-Ebene senden.

sich also die KeyboardService unter Berücksichtigung erstellen, wie die Dienste in der Charm Down-Bibliothek erstellt werden.

Da dies ein wenig aus Umfang hier habe ich diese gist mit den erforderlichen Dateien erstellt.

Gehen Sie folgendermaßen vor, damit es funktioniert:

  1. erstellen Gluon Projekt

erstellen Gluon-Projekt (Einzelansicht) mit der neuesten Version der Gluon-Plugin für Ihren IDE.

  1. die KeyboardService Schnittstelle

Fügen Sie das Paket com.gluonhq.charm.down.plugins hinzufügen. Fügen Sie die Klassen KeyboardService (link) und KeyboardServiceFactory (link).

public interface KeyboardService { 
    public ReadOnlyFloatProperty visibleHeightProperty(); 
} 
  1. iOS Implementierung

Unter dem iOS-Paket hinzufügen, die iOS Implementierung des Dienstes IOSKeyboardService (link).

public class IOSKeyboardService implements KeyboardService { 

    static { 
     System.loadLibrary("Keyboard"); 
     initKeyboard(); 
    } 

    private static ReadOnlyFloatWrapper height = new ReadOnlyFloatWrapper(); 

    @Override 
    public ReadOnlyFloatProperty visibleHeightProperty() { 
     return height.getReadOnlyProperty(); 
    } 

    // native 
    private static native void initKeyboard(); 

    private void notifyKeyboard(float height) { 
     Platform.runLater(() -> this.height.setValue(height)); 
    } 

} 
  1. nativem Code

erstellen native Ordner unter /src/ios und fügen Sie den Keyboard.h (link) Datei:

#import <UIKit/UIKit.h> 
#include "jni.h" 

@interface Keyboard : UIViewController {} 
@end 

void sendKeyboard(); 

und die Keyboard.m (link) Datei:

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 

  1. Erstellen Sie die native Bibliothek

Auf einem Mac mit einer aktuellen Version von XCode, können Sie die native Bibliothek libKeyboard.a bauen. Dazu müssen Sie die xcodebuild Aufgabe der build.gradle Datei des Projekts (link) hinzufügen. Es basiert auf der ios-build.gradlefile von Charm Down.

task xcodebuild { 
    doLast { 
     xcodebuildIOS("$project.buildDir","$project.projectDir", "Keyboard") 
    } 
} 

Speichern Sie das Projekt, und führen Sie ./gradlew clean build xcodebuild von der Kommandozeile unter der Projektwurzel.

Wenn alles vorhanden ist, sollten Sie libKeyboard.a unter build/native finden. Kopieren Sie die Datei, erstellen Sie den Ordner jniLibs unter src/ios, und fügen Sie sie dort ein.

  1. Umsetzung des Service

hinzufügen TextField zum BasicView, und die Ausrichtung zu BOTTOM-CENTER ändern.

VBox controls = new VBox(15.0, label, button, new TextField()); 
controls.setAlignment(Pos.BOTTOM_CENTER); 

Umsetzung des Service:

Services.get(KeyboardService.class).ifPresent(keyboard -> { 
    keyboard.visibleHeightProperty().addListener((obs, ov, nv) -> 
     setTranslateY(-nv.doubleValue())); 
}); 
  1. Deploy und

Sie sollten alles an der richtigen Stelle laufen. Schließen Sie Ihr iPhone/iPad an und führen Sie ./gradlew --info launchIOSDevice aus.

Wenn das Textfeld den Fokus erhält, zeigt die Soft-Tastatur, und der Blick wird übersetzt, so dass das Textfeld ist voll sichtbar:

Hoffentlich wird dieser Service in Charm unten auf einige enthalten sein Punkt. Aber dies ist auch ein gutes Beispiel dafür, wie Sie benutzerdefinierte Dienste hinzufügen können. Beachten Sie auch, dass das Charm Down-Projekt Open Source ist, daher ist jeder Beitrag willkommen.

+0

Brilliant! Vielen Dank!! – tonimaroni

+0

Hey José. Ich habe heute nur Zeit gefunden, das obige Plugin zu implementieren. Perfekt beschrieben und alles funktioniert. Ich habe eine Schaltfläche "Senden" direkt an ein Textfeld. Mit der obigen Lösung muss ich zweimal auf "Senden" drücken. Das erste Mal entfernt es die Tastatur .. dann muss ich erneut auf die Schaltfläche klicken, um es seine Arbeit zu erledigen. Haben Sie eine Idee, was ich ändern muss, wenn die Tastatur aktiv ist, wird beim ersten Mal eine Taste gedrückt. Vielen Dank. – tonimaroni

+0

Ersetzen Sie 'button.setOnAction()' durch 'button.setOnMouseClicked()', das sollte funktionieren. Irgendwie wird das 'fire()' Ereignis verbraucht, wenn die Tastatur geschlossen wird und 'onAction' nicht ausgelöst wird. –

Verwandte Themen