黑莓6:长按显示菜单,短按运行1动作

时间:2011-05-08 14:51:05

标签: blackberry menu touch gesture tap

Hello BB程序员,

如果你看一下带触摸屏的Blackberry 6手机上的原生联系人(地址簿)应用程序 - 它有一个非常自然的行为:

  1. 短暂点击正在执行默认操作 - 查看所选的地址簿条目
  2. 长按并显示包含多个操作的菜单:
  3. Addressbook

    我正在尝试使用ListField创建一个具有类似(和直观)行为的应用程序:在短暂点击时运行默认操作并在屏幕中间显示一个菜单,并在较长时间内触摸几个辅助操作

    我搜索了很多,不幸的是只设法创建了一个完全相反的行为的测试应用程序:

    我在听TouchGesture.HOVER并运行editMenu.run()。而对于短暂的点击菜单本身(我还没有找到,是什么让它出现,MainScreen / Screen中的一些方法?)。我试过运行onMenu(0),但菜单出现在右上角而不是屏幕中心。

    MyList app

    下面是我非常简单的测试代码 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 touchEvent(TouchEvent event) {
                if (event.getEvent() == TouchEvent.GESTURE) {
                    TouchGesture gesture = event.getGesture();
                    if (gesture.getEvent() == TouchGesture.HOVER) {
                        System.err.println("XXX hover=" + gesture.getHoverCount() + ", index=" + myList.getSelectedIndex());
                        editMenu.run();
                        // onMenu(0);
                        return true;
                    }
                }
                return super.touchEvent(event);
            }
        };
    
        private final MenuItem addMenu = new MenuItem("Add item", 0, 0) {  
            public void run() { 
                Status.show("Adding new item");
            }
        };
    
        private final MenuItem editMenu = new MenuItem("Edit item", 1, 0) {  
            public void run() { 
                Status.show("Editing existing item: " + myList.getSelectedIndex());
            }
        };
    
        private final MenuItem removeMenu = new MenuItem("Remove item", 2, 0) {  
            public void run() { 
                Status.show("Removing existing item: " + myList.getSelectedIndex());
            }
        };
    
    
        public MyScreen() {
            setTitle("How to display menu on long click?");
            myList.set(new String[] { "Item 1", "Item 2", "Item 3", "Item 4", }); 
            add(myList);
    
            addMenuItem(addMenu);
            addMenuItem(editMenu);
            addMenuItem(removeMenu);
        }
    }
    

    谢谢! 亚历

1 个答案:

答案 0 :(得分:1)

此处描述的问题与操作系统6中引入的新Pop-up menus有关。使用TouchEvent是一种黑客行为,并不适用于所有设备(并非所有OS 6设备都具有触摸屏)。

class MyScreen extends MainScreen {

    ObjectListField myList = new ObjectListField() {
        protected boolean navigationClick(int status, int time) {
            editMenu.run();
            return true;
        }
    };

    private final MenuItem addMenu = new MenuItem("Add item", 0, 0) {  
        public void run() { 
            Status.show("Adding new item");
        }
    };

    private final MenuItem editMenu = new MenuItem("Edit item", 1, 0) {  
        public void run() { 
            Status.show("Editing existing item: " + myList.getSelectedIndex());
        }
    };

    private final MenuItem removeMenu = new MenuItem("Remove item", 2, 0) {  
        public void run() { 
            Status.show("Removing existing item: " + myList.getSelectedIndex());
        }
    };

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

        addMenuItem(addMenu);
        addMenuItem(editMenu);
        addMenuItem(removeMenu);
    }
}

为什么这会按预期工作?将菜单项添加到屏幕隐式地为屏幕设置ContextMenuProvider(它定义了显示屏幕弹出菜单的策略)。因此,悬停在屏幕级别按预期工作 - 屏幕检测到“悬停事件”并打开弹出菜单。另一方面,使用navigationClick()中的列表处理“点按”。