2011-05-08 34 views
1

你好老鄉BB程序員,黑莓6:長按顯示菜單,運行在短按一下1個行動

如果你看一下本機通訊錄中的黑莓6的手機上(通訊錄)應用與觸摸屏 - 它有一個很自然的行爲:

  1. 在短輕拍正在執行默認的動作 - 查看所選的地址簿條目
  2. 在長觸摸並按住菜單與幾個動作顯示:

Addressbook

我試圖創建一個ListField和類似(直觀)行爲自己的應用程序:在短輕拍運行默認的行動,並在幾個次要的行動顯示在屏幕中間的菜單更長的觸摸

我已經搜查了很多,可惜只設法創建SOFAR正好相反的行爲測試的應用程序:

我聽一個TouchGesture.HOVER和運行editMenu.run()。而對於短按自動菜單(我還沒有找到,是什麼使它出現,在MainScreen/Screen中有一些方法?)。我試着運行菜單(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

這裏描述的問題涉及到在OS 6.使用TouchEvent引入的新Pop-up menus是一個黑客,不會爲所有設備(不是所有的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()中的清單一起處理。

+0

真棒回答,謝謝 – 2011-05-09 09:25:55

+0

我喜歡你問的方式。所以很高興回答這樣一個明確的問題。 – 2011-05-09 10:06:23