2

ViewGroupカスタムを別のカスタムに追加するさまざまな方法をデバッグするのに 1 日を費やしましたが、ViewGroupどれも機能せず、その方法を示す公式のドキュメントやサンプルがないため、ほぼ夢中になりました...

基本的に、私は2つのカスタムを持っていますViewGroup:

  1. HorizontalDockView伸びるViewGroup
  2. GameEntryView伸びるFrameLayout

HorizontalDockView、などをオーバーライドonDrawし、onMeasureすべてが正常に呼び出され、完全に機能します。ただし、GameEntryView内部HorizontalDockViewのコンストラクターから作成して を呼び出すaddView(gameEntryView)と、がどのスレッドから呼び出されたかにgameEntryView関係なく、親で呼び出し、ロード、および setContentView が表示されることはありません。すべてのオブジェクトを一覧表示すると、まだそこにあります。layoutParamsaddViewHorizontalDockViewhorizontalDockView.getChildAt();gameEntryView

絶望的です、私は GameEntryView のonDraw, onMeasure,dispatchDrawメソッドを介してデバッグしようとしましたが、実際にはどれも呼び出されないことに気付きました! いいえ.. 一度もありません!

親 (Horizo​​ntalDockView の) on* 呼び出しですべての子ビューを反復処理し、子の on* を明示的に呼び出す必要がありますか? 親で super.on*() を呼び出していました。

setWillNotDraw( false );親クラスと子クラスの両方を呼び出しました。

親のビュー内に子を表示するにはどうすればよいですか? 簡単なサンプルまたは既存の小さなオープン ソース プロジェクトは大歓迎です!

どうもありがとうございました!

4

1 に答える 1

5

上書きしましたonLayoutか?Android があなたの をレイアウトするときViewGroup、あなたViewGroupは子をレイアウトする責任があります。

このコードは、すべての子を互いの上にレイアウトするカスタム ViewGroup からのものです。

@Override
protected void onLayout(final boolean changed, final int l, final int t, final int r, final int b) {

    int count = this.getChildCount();
    for (int i = 0; i < count; i++) {

        View child = this.getChildAt(i);
        child.layout(0, 0, child.getMeasuredWidth(), child.getMeasuredHeight());
    }
}

完全を期すために、onMeasureオーバーライドは次のとおりです。

@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {

    int parentWidth  = MeasureSpec.getSize(widthMeasureSpec);
    int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
    this.setMeasuredDimension(parentWidth, parentHeight);

    int count = this.getChildCount();
    for (int i = 0; i < count; i++) {

        View child = this.getChildAt(i);
        this.measureChild(
            child,
            MeasureSpec.makeMeasureSpec(parentWidth, MeasureSpec.EXACTLY),
            MeasureSpec.makeMeasureSpec(parentHeight, MeasureSpec.EXACTLY));
    }
}
于 2013-07-09T09:54:46.077 に答える