Кодовое имя один - Событие длительного нажатия, чтобы игнорировать нормальное нажатие. - PullRequest
0 голосов
/ 03 декабря 2018

Я следовал этому руководству и у меня есть рабочий пример до самого конца демонстрации (очень полезный учебник, порекомендует 10/10):

https://codenameone.teachable.com/courses/java-for-mobile-devices-introducing-codename-one/lectures/2647773

Теперь яЯ хотел расширить этот список до более практичного, добавив кнопку с плавающим действием для добавления новых элементов, например:

fab = FloatingActionButton.createFAB(FontImage.MATERIAL_ADD);
fab.bindFabToContainer(current.getContentPane(), Component.RIGHT,
Component.BOTTOM);
fab.addActionListener(e -> { // show dialog for adding new item });

Само по себе это работает отлично.Теперь самое сложное.При использовании события длинного нажатия для любого из элементов должны произойти две вещи:

  1. визуальный элемент долго нажатого элемента должен измениться, чтобы указать, что он выбран (не в терминах Checkbox или ToggleButton«выберите», но выделите.
  2. FAB должен изменить свой значок и список действий, чтобы удалить выделенный элемент.

Событие длинного нажатия достигается при переопределении метода longPointPress из флажкакласс:

@Override
public void longPointerPress(int x, int y){
     mainForm.longPressEvent(this);
    // no event parameter for e.consume();
}

На мои вопросы:

Q1: Когда я использую прослушиватель действий из ToggleButton, запускается как обычное событие нажатия, так и длинное событие Press.Однако мне нужно различать эти два метода. Метод longPointerPress не имеет события в списке параметров, поэтому я не могу использовать это событие после выполнения моей длинной операции Press Event. Как я могу предотвратить запуск прослушивателя обычного действия?

Q2: для "эффекта подсветки" я бы хотел, чтобы у элемента было поле со всех сторон, oveралл сокращает элемент на эту сумму.Другими словами, без увеличения предыдущего общего размера.Просто добавляя поле, элемент становится больше.Как можно сжать данный элемент с полем со всех сторон, но сохранить исходный размер?

Q3: FAB имеет только опцию "setIcon", но не "setMaterialIcon".Следовательно, в настоящее время я воссоздаю FAB каждый раз, когда он изменяется, так как я не хочу вмешиваться в задействованные стили.Есть ли лучший способ, чем этот?

//this is the unwanted function, as I dont want to set the style myself
fab.setIcon(FontImage.createMaterial(icon, s));

//Delete FAB pressed, change to Add FAB
fab.remove();
fab = FloatingActionButton.createFAB(FontImage.MATERIAL_ADD);
fab.bindFabToContainer(current.getContentPane(), Component.RIGHT, Component.BOTTOM);

1 Ответ

0 голосов
/ 03 декабря 2018

Событие действия всегда вызывается при отпускании указателя, независимо от того, было ли запущено длинное событие нажатия, поскольку мы «не знаем», что вы обработали событие longPress.Вам необходимо создать такой флаг, как:

private boolean handledInLongPress;

public void longPress(int x, int y) {
   // do your stuff
   handledInLongPress = true;
}


private void handleActionEvent(ActionEvent ev) {
    // I'm using this as a placeholder for your event code
    // block the event from propagating and undo anything it might
    // have triggered
    ev.consume();
}

Я бы порекомендовал использовать setUIID() для элементов и определить набор "delete *" UIID.Вы можете определить меньшие отступы и шрифты, чтобы создать эффект сжатия, но это может быть сложно, если у вас также есть значки.Вы можете уменьшить указанные значки и сохранить оригинал для восстановления в свойстве клиента.

FAB делает много предположений, поэтому его повторное создание (или использование двух экземпляров), вероятно, является лучшим подходом, чем попытка установитьзначок.В текущей реализации невозможно изменить значок FAB во время выполнения.

...