#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), оно появляется в правом верхнем углу….