シナリオ
画面には 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);
}
最終的な質問
最終的には、フィールド要素を再描画できるようにしながら、メニュー マネージャーのカスタム レイアウトを維持したいと考えています。ここに私の最後の質問があります:
これを経験したことがありますか?
フィールド要素が画面に追加/削除されると、メニュー マネージャが間違った順序で描画を開始するのはなぜですか?
ネイティブの Manager.sublayout() は、描画順序を維持しないことを行いますか?