На данный момент в JavaFX или JavaFXPorts нет встроенного метода для получения (собственной) программной клавиатуры iOS.
Чтобы получить клавиатуру и выяснить, будет ли она покрыта каким-либо узлом, например TextField
, потребуется Service
из доступных в Gluon Charm Down библиотека, но пока такой KeyboardService
нет.
На основе собственных решений, таких как это, легко получить уведомление, когда клавиатура отображается или скрывается. Таким образом, мы могли бы использовать эти слушатели и отправить значение высоты обратно на уровень JavaFX.
Итак, давайте создадим KeyboardService
с учетом того, как сервисы создаются в библиотеке Charm Down.
Поскольку здесь это немного выходит за рамки, я создал этот суть с необходимым файлы.
Выполните следующие шаги, чтобы заставить его работать:
- Создать проект Gluon
Создайте проект Gluon (одно представление) с последней версией подключаемого модуля Gluon для вашей IDE.
- Добавьте интерфейс KeyboardService
Добавьте пакет com.gluonhq.charm.down.plugins
. Добавьте классы KeyboardService
(ссылка) и KeyboardServiceFactory
(ссылка).
public interface KeyboardService {
public ReadOnlyFloatProperty visibleHeightProperty();
}
- Реализация iOS
Под пакетом iOS добавьте реализацию сервиса IOSKeyboardService
для iOS (ссылка ).
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));
}
}
- Собственный код
Создайте папку native
в папке /src/ios
и добавьте файл Keyboard.h
(ссылка). :
#import <UIKit/UIKit.h>
#include "jni.h"
@interface Keyboard : UIViewController {}
@end
void sendKeyboard();
и файл Keyboard.m
(ссылка):
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
- Создайте собственную библиотеку
На Mac с последней версией XCode вы можете собрать собственную библиотеку libKeyboard.a
. Для этого нужно добавить задачу xcodebuild
в файл build.gradle
проекта (ссылка а>). Он основан на ios-build.gradle
file из Charm Down.
task xcodebuild {
doLast {
xcodebuildIOS("$project.buildDir","$project.projectDir", "Keyboard")
}
}
Сохраните проект и запустите ./gradlew clean build xcodebuild
из командной строки в корне проекта.
Если все на месте, вы должны найти libKeyboard.a
под build/native
. Скопируйте файл, создайте папку jniLibs
под src/ios
и вставьте его туда.
- Внедрение службы
Добавьте TextField
к BasicView
и измените выравнивание на BOTTOM-CENTER
.
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
.
Когда textField получает фокус, появляется программная клавиатура, и представление переводится, так что textField полностью виден:
Надеюсь, эта услуга когда-нибудь будет включена в Charm Down. Но это также хороший пример того, как вы можете добавить пользовательские услуги. Также обратите внимание, что проект Charm Down имеет открытый исходный код, поэтому приветствуется любой вклад.
person
José Pereda
schedule
26.11.2016