Blackberry: обнаружение длительного нажатия на поле списка и меню отображения

#blackberry #menu #contextmenu #listfield #long-click

#ежевика #меню #contextmenu #поле списка #длительное нажатие

Вопрос:

Как вы обнаруживаете длительное нажатие на компонент ListField?

Переопределяете ли вы его navigationClick (int status, int time) и возитесь с его аргументом time (как?) или есть какой-то встроенный метод для обнаружения длительных нажатий?

И что еще более важно — как вы отображаете меню (то, что в середине экрана) после обнаружения такого нажатия?

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

Ниже приведен мой текущий тестовый код — srcmypackageMyList.java:

введите описание изображения здесь

 package mypackage;

import java.util.*;
import net.rim.device.api.collection.*;
import net.rim.device.api.collection.util.*; 
import net.rim.device.api.system.*;
import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.ui.decor.*;
import net.rim.device.api.util.*;

public class MyList extends UiApplication {
    public static void main(String args[]) {
        MyList app = new MyList();
        app.enterEventDispatcher();
    }

    public MyList() {
        pushScreen(new MyScreen());
    }
} 

class MyScreen extends MainScreen {
    ObjectListField myList = new ObjectListField() {
        protected boolean navigationClick(int status, int time) {
            System.err.println("XXX status="   status   ", index="   getSelectedIndex());
            return true;
        }
    };

    public MyScreen() {
        setTitle("How to detect long click?");
        myList.set(new String[] { "Item 1", "Item 2", "Item 3", "Item 4", }); 
        add(myList);
    }
}
  

Спасибо
Алекс

Ответ №1:

Вы можете переопределить touchEvent метод вашего поля. Затем сделайте что-то вроде этого:

 ObjectListField myList = new ObjectListField() {
        long touchedAt = -1;
        long HOLD_TIME = 2000; // 2 seconds or whatever you define the hold time to be
        protected boolean touchEvent(TouchEvent message) {
            if(message.getEvent() == TouchEvent.DOWN) {
               touchedAt = System.currentTimeMillis();
            } else if(message.getEvent() == TouchEvent.UP) {
               if(System.currentTimeMillis() - touchedAt < HOLD_TIME)
                  touchedAt = -1; // reset
               else
                  //write logic you need for touch and hold
            }
            return true;
        }
    };
  

Пожалуйста, обратите внимание, что это приблизительная реализация, просто чтобы дать вам представление. Я использовал здесь только временную координату. Вероятно, в вашей реализации потребуется учитывать координаты X и Y того места, где пользователь коснулся экрана, потому что, если бы он переместил палец, это не было бы касанием и удержанием.

Комментарии:

1. Спасибо и как мне отобразить контекстное меню в середине?

2. Попробуйте использовать это: blackberry.com/developers/docs/4.7.0api/net/rim/device/api/ui /…

3. Спасибо, что указали мне правильное направление. В итоге я использовал TouchGesture. Однако НАВЕДИТЕ курсор. И я все еще не понял, как отобразить меню в центре экрана — когда я запускаю onMenu (0), оно появляется в правом верхнем углу….