2

BB プログラマーの皆さん、こんにちは。

タッチ スクリーン付きの Blackberry 6 電話でネイティブの連絡先 (アドレス帳) アプリケーションを見ると、非常に自然な動作をしています。

  1. 短いタップで、デフォルトのアクションが実行されます - 選択したアドレス帳のエントリを表示します
  2. 長押しすると、いくつかのアクションを含むメニューが表示されます。

住所録

私は ListField と同様の (そして直感的な) 動作を自分で作成しようとしています:短いタップでデフォルト アクションを実行し、画面の中央にメニューを表示し、長いタッチでいくつかの二次アクションを表示します

私はたくさん検索しましたが、残念ながら、まったく反対の動作をするテストアプリを作成することしかできませんでした:

TouchGesture.HOVER をリッスンし、editMenu.run() を実行します。そして、短いタップの場合、メニューが自動的に表示されます(まだ見つけていませんが、何が表示されるのか、メインスクリーン/スクリーンのいくつかのメソッドですか?)。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);
    }
}

なぜこれが期待どおりに機能するのですか? 画面にメニュー項目を追加すると、暗黙的に画面に が設定ContextMenuProviderされます (画面のポップアップ メニューを表示する方法を定義します)。したがって、ホバーは画面レベルで期待どおりに機能します。「ホバーイベント」を検出してポップアップメニューを開くのは画面です。一方、「タップ」は のリストで処理されnavigationClick()ます。

于 2011-05-09T09:05:31.627 に答える