2

各位BB程序员,大家好,

如果您查看带有触摸屏的 Blackberry 6 手机上的本机联系人(地址簿)应用程序 - 它具有非常自然的行为:

  1. 轻按一下,将执行默认操作 - 查看选定的地址簿条目
  2. 长按会显示一个包含多个操作的菜单:

地址簿

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

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

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

我的列表应用程序

下面是我非常简单的测试代码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);
    }
}

谢谢!亚历克斯

4

1 回答 1

1

此处描述的问题与OS 6 中引入的新弹出菜单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);
    }
}

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

于 2011-05-09T09:05:31.627 回答