angular - отключить всплывающее контекстное меню, когда пользователь дважды нажимает - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь отключить вырезание, копирование, вставку и выбор всех действий из мобильного приложения NativeScript + Angular (для iOS и Android)

<TextField class="m-5 input input-border" disableCutCopyPaste> </TextField>

Поэтому я создал директиву, которая отлично работает на StockУстройства с ОС Android, но на пользовательских устройствах с ОС Android пользователи могут выполнять операции вырезания, копирования, вставки, дважды нажав на текст, введенный в текстовое поле

. Чтобы отключить двойное нажатие, я добавил следующую строку кода

textField.nativeView.setOnTouchListener(false);

в созданной мной директиве (приведенной ниже)

import { Directive, OnInit, OnDestroy, ElementRef, Renderer2 } from "@angular/core";
import { isIOS } from "tns-core-modules/platform";
import { layout } from "tns-core-modules/utils/utils";
import { EventData } from "tns-core-modules/data/observable";
import { TextField } from "tns-core-modules/ui/text-field";

declare var UITextField, CGRectMake;

if (isIOS) {
    UITextField.prototype._originalCanPerformActionWithSender = UITextField.prototype.canPerformActionWithSender;
    UITextField.prototype.canPerformActionWithSender = function (action, sender) {
        if (this.disableMenu) {
            return false;
        }
        return UITextField.prototype._originalCanPerformActionWithSender.call(this, action, sender)
    };
}

@Directive({
    selector: "[disableCutCopyPaste]"
})
export class DisableCutCopyPasteDirective implements OnInit, OnDestroy {

    listener: () => void;

    constructor(private renderer: Renderer2, private el: ElementRef) {

    }

    ngOnInit() {
        this.listener = this.renderer.listen(this.el.nativeElement, TextField.loadedEvent, (event: EventData) => {
            const textField = <TextField>event.object;
            if (isIOS) {
                Object.defineProperty(textField.nativeView, "disableMenu", {
                    get: function () {
                        return true;
                    }
                });
            } else {
                textField.nativeView.setLongClickable(false);
                textField.nativeView.setOnTouchListener(false);
            }
        });
    }

    ngOnDestroy() {
        this.removeListener();
    }

    private removeListener() {
        if (this.listener) {
            this.listener();
            this.listener = null;
        }
    }
} 

Не работает, и я получаю следующую ошибку

System.err: Error: Cannot convert boolean to Landroid/view/View$OnTouchListener; at index 0

Я довольноновичок в NativeSCript с Angular. Так что любая помощь будет оценена.

Playground link

Ответы [ 2 ]

1 голос
/ 09 октября 2019

См. Официальные документы для Android при использовании нативного API, setOnTouchListener(...) ожидает экземпляр интерфейса View.OnTouchListener .

textField.nativeView.setOnTouchListener(new android.view.View.OnTouchListener({
                onTouch: function (view, event) {
                    if (event.getAction() == android.view.MotionEvent.ACTION_UP) {
                        view.requestFocus();
                        utils.ad.showSoftInput(view);
                    }
                    return true;
                }
            }));

Обновленная игровая площадка

0 голосов
/ 09 октября 2019

setOnTouchListener () требует OnTouchListener () в качестве аргумента. Вам следует попробовать использовать setOnTouchListener (null) или создать OnTouchListener (), который ничего не делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...