Blackberry:检测ListField和显示菜单上的长按

时间:2011-05-06 11:52:09

标签: blackberry menu contextmenu listfield long-click

如何检测ListField组件的长按?

您是否覆盖其 navigationClick(int status,int time)并使用其时间参数(如何?)进行摸索?还是有一些用于检测长次点击的内置方法?

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

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

以下是我当前的测试代码 - src \ mypackage \ MyList.java

enter image description here

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 个答案:

答案 0 :(得分:0)

您可以覆盖字段的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坐标,因为如果他移动了他的手指,那么这不是一个触摸和保持