我有一个LinearLayout,这个LinearLayout将保存动态放置的视图。我需要找出LinearLayout子元素的宽度,但是必须在onCreate方法中完成。从研究中我发现你不能使用这种方法的getWidth。所以我使用onWindowFocusChanged,它适用于父LinearLayout(返回实际大小),但它不适用于它的子节点。
我注意到的另一件事是,当屏幕消失并且屏幕被锁定时,我可以在日志中看到返回的孩子的实际宽度(我认为活动正在暂停)。
我真的被卡住了,这是必需的,因为我需要根据子宽度动态放置这些视图。
答案 0 :(得分:5)
您可以使用以下内容。但正如其他人指出的那样,这可能不是一个好主意。
LinearLayout.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
LinearLayout.getMeasuredWidth();
答案 1 :(得分:3)
在onCreate中,视图仍然无法知道附近视图和子项等的状态......所以只有在准备完毕并完成布局过程后,才能获得视图的大小。
这是一个快速的代码,用于在绘制视图之前获取视图的大小:
private static void runJustBeforeBeingDrawn(final View view, final Runnable runnable)
{
final ViewTreeObserver vto = view.getViewTreeObserver();
final OnPreDrawListener preDrawListener = new OnPreDrawListener()
{
@Override
public boolean onPreDraw()
{
Log.d(App.APPLICATION_TAG, CLASS_TAG + "onpredraw");
runnable.run();
final ViewTreeObserver vto = view.getViewTreeObserver();
vto.removeOnPreDrawListener(this);
return true;
}
};
vto.addOnPreDrawListener(preDrawListener);
}
或者,如果您愿意,可以使用addOnGlobalLayoutListener
代替addOnPreDrawListener
。
用法示例:
runJustBeforeBeingDrawn(view,new Runnable()
{
@Override
public void run()
{
int width=view.getWidth();
int height=view.getHeight();
}
});
另一种方法是使用onWindowFocusChanged(并检查hasFocus == true),但这并不总是最好的方式(仅用于创建简单视图,而不是用于动态创建)
编辑:runJustBeforeBeingDrawn的替代方案:https://stackoverflow.com/a/28136027/878126
答案 2 :(得分:0)
https://stackoverflow.com/a/3594216/1397218
所以你应该以某种方式改变你的逻辑。