1

私はListViewセクションに取り組んでいます。これでは、ユーザーは名前でコンテンツを検索し、キーボード ボタンを押すことで List の最初の要素に直接移動できます。同様に、(右側の垂直マネージャー) からボタン B を押すと、リストがスクロールされ、フォーカスが B の最初のレコードに移動します。

ここに画像の説明を入力

コードはシミュレーターでは正常に動作していますが、タッチ デバイスでは動作していません - 私は BB 9380 Curve を持っています。

のコードは次のとおりです。

LabelField a = new LabelField("A" , FOCUSABLE)
{
    protected void paint(Graphics graphics) 
    {
        graphics.setColor(0xC4C4C4);
        super.paint(graphics);
    }

    protected boolean navigationClick(int status, int time) 
    {
        //fieldChangeNotify(1);
        injectKey(Characters.LATIN_CAPITAL_LETTER_A);
        injectKey(Characters.LATIN_CAPITAL_LETTER_A);
        return true;
    }
};

private void injectKey(char key) 
{
    try 
    {
        searchList.setFocus();
        KeyEvent inject = new KeyEvent(KeyEvent.KEY_DOWN, key, 0);
        inject.post();
        /*inject.post();*/

    } catch (Exception e) {
        Log.d("In injectKey :: :: :: "+e.toString());
        MessageScreen.msgDialog("In Inject Key "+e.toString());
    }

}
4

1 に答える 1

1

代替ソリューション

これには別の戦略をお勧めします。キー押下イベントをシミュレートする代わりに、特定の文字のキー押下、または同じ文字のタッチ クリックを処理する 1 つのメソッドを定義しますLabelField

ソース: www.blackberry.com

したがって、次を使用してキーの押下を処理するコードを作成できます。

protected boolean keyChar( char character, int status, int time ) 
{
    // you might only want to do this for the FIRST letter entered,
    //   but it sounds like you already have the keypress handling
    //   the way you want it ...
    if( CharacterUtilities.isLetter(character) )
    {
        selectLetter(character);
        return true;
    }

    return super.keyChar( character, status, time );
}

次に、タッチ イベントも処理します。

LabelField a = new LabelField("A" , FOCUSABLE)
{
    protected void paint(Graphics graphics) 
    {
        graphics.setColor(0xC4C4C4);
        super.paint(graphics);
    }

    protected boolean navigationClick(int status, int time) 
    {
        char letter = getText().charAt(0);
        selectLetter(letter);
        return true;
    }
};

次に、1 文字を受け取り、リストのその部分の先頭までスクロールするメソッドを定義するだけです。

private void selectLetter(char letter);

キー インジェクション

ただし、本当に本当にキーの押下をシミュレートしたい場合は、コードを変更して、キー ダウンとキー アップの 2 つのイベントを挿入するようにしてください (現在、2 つのキー ダウン イベントを挿入しています)。これが問題を引き起こしている可能性があります。

    injectKey(Characters.LATIN_CAPITAL_LETTER_A, true);
    injectKey(Characters.LATIN_CAPITAL_LETTER_A, false);

private void injectKey(char key, boolean down) 
{
    try 
    {
        searchList.setFocus();
        int event = down ? KeyEvent.KEY_DOWN : KeyEvent.KEY_UP;
        KeyEvent inject = new KeyEvent(event, key, 0);
        inject.post();
    } catch (Exception e) { /** code removed for clarity **/
    }
}

追記事項

UI の場合、キーアップまたはアンクリックイベントでイベントをトリガーするのが好きです。これにより、ユーザーのエクスペリエンスが向上すると思います。したがって、これを行いたい場合は、 とkeyChar()を置き換えることができます。keyUp()navigationClick()navigationUnclick()

于 2013-05-30T00:52:25.040 に答える