Можно ли добавить представления на макет в мероприятии Onlayout?

StackOverflow https://stackoverflow.com/questions/5976445

  •  12-11-2019
  •  | 
  •  

Вопрос

Можно ли добавить представления на макет во время события Onlayout одного из его детей?

I.e.

framelayout содержит view.onlayout () Я хочу добавить представления на родительский framelayout.

Это потому, что взгляды, которые мне нужны для нарисования на Framelayout, нужны размеры ребенка (ширина, высота), чтобы назначить их к определенным положениям на кардании.

Я уже пытаюсь сделать это, но ничего не нарисовано.Знаете ли вы, как я могу достичь того же эффекта?или если я делаю что-то не так.Не знаю, почему я не могу нарисовать взгляды, событие, если я позвоню с недействительным.

спасибо.

Это было полезно?

Решение

Да, это возможно.Я решил подобную проблему (размещение кнопки контрольной точки в Framelayout через SESTBAR), используя следующий код (методы переопределения от Seekbar):

@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 .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top