0

私はブラックベリーを初めて使用し、1 つのカスタム マネージャーを作成しようとしています。そのため、レイアウトを非常にシンプルにして、2 つの Labelfields を互いに並べて表示するようにしています (両方を Horizo​​ntalFieldManager に配置することで非常に簡単に取得できますが、カスタム マネージャーでこれを行う必要があります)。

出力は次のようになります:-Hello(FirstField) User(SecondField)

これが私のクラスのサブレイアウトメソッドで、Manager に拡張されています

public MyManager() {
    // construct a manager with vertical scrolling
    super(Manager.VERTICAL_SCROLL);
    }

protected void sublayout(int width, int height) {
        Field field;
        // get total number of fields within this manager
        int numberOfFields = getFieldCount();
        int x = 0;
        int y = 0;
        for (int i = 0; i < numberOfFields; i++) {
            field = getField(i); // get the field
            setPositionChild(field, x, y); // set the position for the field
            layoutChild(field, width, height); // lay out the field
            x = x + field.getHeight();
        }
        setExtent(width, height);
    }

この行を削除するとx = x+field.getWidth();、両方のテキスト (Hello User) が重なってしまいます (これは x,y = 0 が原因だと思います) 今field.getWidth()、フィールド 1 で使用されている幅を返すことを望みますが、代わりにそれを与えています私のディスプレイの幅(これは私が思うものです)なので、レイアウトでHelloだけを見ることができます。

アイテムを垂直に配置する場合は、適切に使用できますが、適切な幅の値が返されないy = y+field,getHeight();理由getWidthがわかりません。この問題を理解するためにどこかを誤解させる可能性があります。

getPrefferedWidth()メソッドをオーバーライドする必要がありますか? 私もこれを試して、このメソッドをそのままにしておきますが、2つのフィールドの間にいくつかのスペース(2-3)が残り、他のテキストが重なっています。

4

2 に答える 2

1

更新:更新前の質問と私の回答に基づいたフルスケールの例を追加しました(追加した変数定義がsublayout()欠落していることを除いて、メソッドは同じままでした)。y

サブレイアウトをオーバーライドする場合は、最初にフィールドをレイアウトしてから配置する必要があります。このコードを試してください:

public final class HelloUserScreen extends MainScreen {
    public HelloUserScreen() {        
        Manager customManager = new Manager(0) {
            protected void sublayout(int width, int height) {
                Field field;
                int numberOfFields = getFieldCount();

                int widthUsed = 0;
                int maxHeight = 0;
                int y = 0;

                for (int i = 0; i < numberOfFields; i++) {
                    field = getField(i); // get the field

                    // first layout
                    layoutChild(field, width-widthUsed, height);

                    // then position
                    setPositionChild(field, widthUsed, y);

                    widthUsed += field.getWidth();
                    maxHeight = Math.max(maxHeight, field.getHeight());
                }

                setExtent(widthUsed, maxHeight);
            }
        };

        LabelField helloLabel = new LabelField("Hello ");
        helloLabel.setBackground(BackgroundFactory.createSolidBackground(Color.GREEN)); 
        customManager.add(helloLabel);

        LabelField userLabel = new LabelField("user");
        userLabel.setBackground(BackgroundFactory.createSolidBackground(Color.YELLOW)); 
        customManager.add(userLabel);

        add(customManager);
    }
}

このコードは次の画面を生成します

ここに画像の説明を入力

一部のフィールドをレイアウトした後、レイアウトに使用できる幅と高さが小さくなることを考慮する必要があります(この場合、フィールドを水平にレイアウトしているため、ほとんどの場合幅が重要です)。

setExtent()もう 1 つのことは、受け取った最大の幅と高さではなく、フィールドのレイアウトに実際に使用した幅と高さでメソッドを呼び出したいということですsublayout()(特定の UI レイアウト ロジックのために意図的に実行している場合を除く)。

于 2012-05-10T19:40:03.430 に答える
0

ここではカスタム フィールドは必要ありません。とそこにはjustHorizontalFieldManagerと overridegetPreferredWidth()を使用します。Fieldreturn getScreen().getWidth() / 2

于 2012-05-10T14:58:42.513 に答える