【问题标题】:Blackberry: detect long click on a ListField and display menuBlackberry:检测长按 ListField 并显示菜单
【发布时间】:2011-05-06 11:52:08
【问题描述】:

如何检测对 ListField 组件的长按?

您是否覆盖了它的 navigationClick(int status, int time) 并摸索了它的 time 参数(如何?)还是有一些内置方法来检测长点击?

更重要的是 - 一旦检测到这样的点击,你如何显示菜单(屏幕中间的那个)?

背景是我想让用户在短按时编辑所选项目。在长按时,我想在屏幕中间显示一个菜单以提供辅助任务:删除项目、更改项目显示顺序等。

下面是我目前的测试代码 - src\mypackage\MyList.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);
    }
}

谢谢 亚历克斯

【问题讨论】:

    标签: blackberry menu contextmenu listfield long-click


    【解决方案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 坐标,因为如果他移动了手指,那将不是触摸并按住

    【讨论】:

    • 谢谢,如何在中间显示上下文菜单?
    • 感谢您为我指明了正确的方向。不过,我最终还是使用了 TouchGesture.HOVER。而且我还没有弄清楚如何在屏幕中心显示菜单 - 当我运行 onMenu(0) 时,它出现在右上角....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    相关资源
    最近更新 更多