NativeScript - Android & Angular - как написать службу, которая следит за событием изменения ViewTreeObserver.OnGlobalLayoutListener - PullRequest
0 голосов
/ 05 мая 2020

Я пишу приложение с Angular 8 и NativeScript 6.

Это связано с этим вопросом здесь: NativeScript - android: windowSoftInputMode = "adjustResize" не вызывает изменение макета событие в примере проекта

Я читал, что нет прямого способа проверить, открыта клавиатура или нет в Android: { ссылка } Поэтому мы должны использовать другие означает проверить, открыт он или нет.

Один из вариантов - проверить высоту представления, чтобы увидеть, не изменилось ли оно: Как проверить видимость программной клавиатуры в Android? Я не знаю, как реализовать это в NativeScript.

Я хочу прослушивать событие, когда клавиатура открывается в моем приложении. Я установил этот параметр в файле AndroidManifest: android:windowSoftInputMode="adjustResize"

Я хочу написать службу angular, которая будет возвращать наблюдаемый логический тип, который я могу использовать, чтобы проверить, открыта и закрыта ли клавиатура. Это должно быть наблюдаемым.

Я исследовал здесь:

https://developer.android.com/reference/android/view/ViewTreeObserver.OnGlobalLayoutListener

Я могу прослушивать глобальные изменения макета.

Problem: 
Right now my code only returns true when the keyboard opens.
How can I use these events to detect if the keyboard has closed?

Я нашел здесь фрагмент кода:

https://github.com/markhatchell/nativescript-keyboardshowing/blob/master/index.js

Вот мой проект: https://github.com/aubrey-fowler/KeyBoardHelp

Вот моя попытка:

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import * as application from 'tns-core-modules/application';
import { ad } from "utils/utils";
var frame = require('ui/frame');

@Injectable({
  providedIn: 'root'
})
export class AndroidKeyboardListenerService {

    public watchKeyboard$(): Observable<boolean> {

        return new Observable((observer) => {

            var current_view = frame.topmost().currentPage.android;

            current_view.getViewTreeObserver().addOnGlobalLayoutListener(new android.view.ViewTreeObserver.OnGlobalLayoutListener({
                onGlobalLayout: function () {
                    if (ad.getInputMethodManager().isAcceptingText()) {
                        console.log(' here ');
                        observer.next(true);
                    } else {
                        console.log(' here 2');
                        observer.next(false);
                    }
                }
            }));

        });

    }

}
...