gpt4 book ai didi

android - 是否可以在 onLayout 事件中将 View 添加到布局?

转载 作者:搜寻专家 更新时间:2023-11-01 09:14:04 25 4
gpt4 key购买 nike

是否可以在其子项之一的 onLayout 事件期间向布局添加 View ?

FrameLayout 包含View,在View.onLayout() 中我想将 View 添加到父FrameLayout。

这是因为我需要在 FrameLayout 上绘制的 View 需要 subview 尺寸(宽度、高度)才能将它们分配到 FrameLayout 上的特定位置。

我已经尝试这样做了,但是没有绘制任何东西。你知道我怎样才能达到同样的效果吗?或者如果我做错了什么。不知道为什么我无法绘制 View ,如果我调用无效事件。

谢谢。

最佳答案

是的,这是可能的。我已经使用以下代码(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()方法(它是 protected ,因此只有重写布局的 onLayout 方法时才能使用它)javadoc 说它的目的正是我们在这里讨论的内容,但我不明白为什么它比 addView() 更好。您可以在 ListView 中找到它的用法.

关于android - 是否可以在 onLayout 事件中将 View 添加到布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5976445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com