4

私は BlackBerry でアプリケーションを開発しておりHorizontalFieldManager、下の画像に示すようなコンポーネントで満たされた多くの があります。

コンポーネントで満たされた私の Horizo​​ntalFieldManager

そして、動的に入力されるループ内にこれらのような多くHorizontalFieldManagerの sを追加する必要があります。forまとめると、リスト内の 1 つの行のように見えます。これまでのところ、私はこれを行うことができました。

しかし問題は、ユーザーがこのような「行」をクリックできる必要があることです。しかし、HorizontalFieldManagerはフォーカス可能またはクリック可能ではなく、内部に 4 つのコンポーネントがあり、4 つすべてが等しく重要であるため、これを行う方法を見つけ出すことができませんでした。

誰でも私がしようとしていることを行う方法を提案できますか? 基本的に、ユーザーは画像に表示されている「行」をクリックできる必要があります。この「行」は、多くのコンポーネント (2 HorizontalFieldManager、 1 VerticalFieldManager、 1 BitmapField、および 3 LabelFields) で構成されています。

どんな助けでも大歓迎です!

4

3 に答える 3

3

BBdevはあなたの質問に直接答えました、しかしあなたが気づいたように、パフォーマンスはかなり遅いです。これは、マネージャーを使用してこのように数百行をスタンプアウトすると、UIのレイアウトステップに多くのオーバーヘッドが追加されるためです。レイアウトは、新しい行を追加するたびを含め、画面上で何かが変更されるたびに、これらすべてのマネージャーに対して実行されます。これは基本的に2次式です。

これを高速化する方法は、代わりにListFieldを使用することです。ListFieldの1つの問題点は、標準のOSフィールドに依存するのではなく、直接描画を行う必要があることです。ただし、ListFieldのパフォーマンスが非常に高速であるという利点があります。各行の高さは固定されているため、ListFieldは表示されている行をすばやく判別し、それらの行に対してのみペイントコードを呼び出すことができます。

これは、フィールドの仮想サイズではなく、フィールドの表示サイズに合わせて作業がスケーリングされることを意味します。UIの仮想深度には境界がないため、これはUIコードを作成するときに維持するのに非常に望ましいプロパティですが、物理画面のピクセル数は固定されているため、UIの表示部分で作業をスケーリングすることにより、良好なパフォーマンス。

于 2012-04-08T18:45:27.057 に答える
2

以下のコードはHorizontalFieldManagerクリック可能にし、必要に応じてこの Hfm にコンポーネントを追加します。

import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.TouchEvent;
import net.rim.device.api.ui.Touchscreen;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.NullField;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import net.rim.device.api.ui.container.MainScreen;

public class sample extends MainScreen implements FieldChangeListener{

 HorizontalFieldManager logInDetailManager=null;
 int background_color=0;

 public sample() {

logInDetailManager = new HorizontalFieldManager(Manager.USE_ALL_WIDTH|Field.FOCUSABLE){
    protected void sublayout(int maxWidth, int maxHeight) {
            int height=40;
        super.sublayout(Display.getWidth(), height);
        setExtent(Display.getWidth(), height);
    }
    protected void paint(Graphics graphics) {

        graphics.setBackgroundColor(background_color);
        graphics.clear();
        invalidate();
        super.paint(graphics);
    }
    protected void onFocus(int direction) {
        super.onFocus(direction);
        background_color=Color.RED;
        invalidate();
    }
    protected void onUnfocus() {
        invalidate();
        background_color=Color.GREEN;

    }
    protected boolean navigationClick(int status, int time) {

        if(Touchscreen.isSupported()){
            return false;
        }else{
            fieldChangeNotify(1);
            return true;
        }

    }
    protected boolean touchEvent(TouchEvent message)
    {
        if (TouchEvent.CLICK == message.getEvent())
        {
            FieldChangeListener listener = getChangeListener();
            if (null != listener)
                this.setFocus();
                listener.fieldChanged(this, 1);
        }
        return super.touchEvent(message);
    }
};
logInDetailManager.setChangeListener(this);
logInDetailManager.add(new LabelField("hello"));
logInDetailManager.add(new NullField(Field.FOCUSABLE));
add(logInDetailManager);
add(new LabelField("good",Field.FOCUSABLE));    
}

  public void fieldChanged(Field field, int context) {            
if(field==logInDetailManager){                  
    UiApplication.getUiApplication().invokeLater(new Runnable() {                          
        public void run() {                                 
            Dialog.inform("Hi how are you?");                          
        }                    
    });          
}   
}

}

これがお役に立てば幸いです。乾杯 :)

于 2012-04-06T10:21:53.263 に答える
0

代わりに水平フィールドの配列がある場合、フォーカスの色を処理する方法は?

for (int i = 0; i < listSize; i++) {
        logInDetailManager[i] = new HorizontalFieldManager(
                Manager.USE_ALL_WIDTH | Field.FOCUSABLE) {

配列の 1 つの項目が常にフォーカスされているため、リスト全体がすべて赤になります。

于 2013-03-18T14:11:39.490 に答える