0

シナリオ
画面には 2 つのマネージャーがあります。1) 上部のメニュー マネージャーと 2) 情報/ボタン要素を持つボディ マネージャーです。メニュー マネージャーは、そのメニュー要素 (LabelFields) が適切に配置されるようにカスタム描画を行います。

主要な問題 - マネージャーとサブフィールド
の描画順序 ユーザーがアクションを実行する (ボタンをクリックする) 場合を除いて、画面は正常に描画されますが、ボディ マネージャーを含む要素が追加/削除されます。フィールド要素が本文に追加/削除されると、メニューが描画される順序が混乱します。

body マネージャーがフィールドを追加または削除すると、メニュー マネージャーがそれ自体を描画してからそのサブ要素 (ラベル フィールド) を描画する代わりに、メニュー マネージャーはそのサブ要素を描画し始め、次にそれ自体を描画し始めます。したがって、ラベル フィールドの上にペイントし、それらが消えたように見せます。

コメント
すでに無効化およびその他のオプションを試しました -- フィールド要素をボディに追加/削除した後、invalidate、invalidateall、updateDisplay... を呼び出そうとしました。すべて成功せずに。

カスタム サブレイアウトの削除が機能する -- この問題を解決できる唯一の方法は、メニュー マネージャのカスタム サブレイアウト ロジックを削除することです。残念ながら、メニュー システムは従来の方法で描画し、十分な間隔を提供しません。

以下は、メニュー マネージャーのサブレイアウト コードです。

public void sublayout(int iWidth, int iHeight)
{
    final int iNumFields = getFieldCount();
    int maxHeight = 0;


    final int segmentWidth = iWidth / iNumFields;
    final int segmentWidthHalf = segmentWidth / 2;

    for (int i = 0; i < iNumFields; i++)
    {
        final Item currentField = (Item)this.getField(i);

        // 1. Use index to compute bounds of the field
        final int xSegmentTrueCenter = segmentWidth * i + segmentWidthHalf;

        // 2. center field inbetween bounds using field width (find fill width of text)
        final int xFieldStart = xSegmentTrueCenter - currentField.getFont().getAdvance(currentField.getText())/2;

        // set up position
        setPositionChild(currentField, xFieldStart, getContentTop() + MenuAbstract.PADDING_VERTICAL);

        // allow child to draw itself
        layoutChild(currentField, iWidth, currentField.getHeight());


        // compute max height of the field
        //int fieldheight = currentField.getHeight();
        maxHeight = currentField.getHeight() > maxHeight
            ? currentField.getHeight() + 2 * MenuAbstract.PADDING_VERTICAL
            : maxHeight;
    }
    this.setExtent(iWidth, maxHeight);
}

最終的な質問
最終的には、フィールド要素を再描画できるようにしながら、メニュー マネージャーのカスタム レイアウトを維持したいと考えています。ここに私の最後の質問があります:

  1. これを経験したことがありますか?

  2. フィールド要素が画面に追加/削除されると、メニュー マネージャが間違った順序で描画を開始するのはなぜですか?

  3. ネイティブの Manager.sublayout() は、描画順序を維持しないことを行いますか?

4

1 に答える 1

1

あなたが説明した動作は見たことがありませんが、次の行は少し厄介です:

// allow child to draw itself
layoutChild(currentField, iWidth, currentField.getHeight());

getHeight() は、フィールドの setExtent が layoutChild メソッドを通じて呼び出されるまで、適切な値を返すべきではありません。私はそれがすべての場合に問題を引き起こすと予想していますが、なぜこれが初めてうまくいくのか分かりません。あなたのロジックでは、その行で currentField.getHeight() の代わりに iHeight を安全に使用できると思います。フィールドは、必要なだけ大きくなります。VerticalFieldManager のようなものでない限り、iHeight のすべてを使用することはありません。

于 2009-06-24T04:06:48.173 に答える