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:
- erstellen Gluon Projekt
erstellen Gluon-Projekt (Einzelansicht) mit der neuesten Version der Gluon-Plugin für Ihren IDE.
- 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();
}
- 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));
}
}
- 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
- 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.gradle
file 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.
- 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()));
});
- 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.
Brilliant! Vielen Dank!! – tonimaroni
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
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. –