2

その子のいずれかの onLayout イベント中にレイアウトにビューを追加することは可能ですか?

すなわち

FrameLayout には View が含まれており、View.onLayout() で親の FrameLayout にビューを追加したいと考えています。

これは、FrameLayout に描画する必要があるビューが、FrameLayout の特定の位置に割り当てるために子ビューの寸法 (幅、高さ) を必要とするためです。

私はすでにそうしようとしていますが、何も描かれていません。どうすれば同じ効果を達成できるか知っていますか? または私が何か間違ったことをしている場合。無効化を呼び出すと、ビュー、イベントを描画できない理由がわかりません。

ありがとう。

4

1 に答える 1

3

はい、可能です。次のコード(SeekBarのオーバーライドされたメソッド)を使用して、同様の問題(チェックポイントボタンをSeekBar上のFrameLayoutに配置)を解決しました。

@Override
protected void onLayout(final boolean changed, final int left, final int top, final int right, final int bottom) {
  super.onLayout(changed, left, top, right, bottom);
  View child = new Button(getContext());

  //child measuring
  int childWidthSpec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec, 0, LayoutParams.WRAP_CONTENT); //mWidthMeasureSpec is defined in onMeasure() method below
  int childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);//we let child view to be as tall as it wants to be
  child.measure(childWidthSpec, childHeightSpec);

  //find were to place checkpoint Button in FrameLayout over SeekBar
  int childLeft = (getWidth() * checkpointProgress) / getMax() - child.getMeasuredWidth();

  LayoutParams param = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
  param.gravity = Gravity.TOP;
  param.setMargins(childLeft, 0, 0, 0);

  //specifying 'param' doesn't work and is unnecessary for 1.6-2.1, but it does the work for 2.3
  parent.addView(child, firstCheckpointViewIndex + i, param);

  //this call does the work for 1.6-2.1, but does not and even is redundant for 2.3
  child.layout(childLeft, 0, childLeft + child.getMeasuredWidth(), child.getMeasuredHeight());
}

@Override
protected synchronized void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec)    {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  //we save widthMeasureSpec in private field to use it for our child measurment in onLayout()
  mWidthMeasureSpec = widthMeasureSpec;
}

ViewGroup.addViewInLayout()メソッドもあります(保護されているため、レイアウトのonLayoutメソッドをオーバーライドする場合にのみ使用できます)。javadocは、その目的がまさにここで説明するものであると述べていますが、なぜそれが優れているのか理解できません。 addView()より。ListViewでその使用法を見つけることができます。

于 2011-08-11T09:16:13.510 に答える