欢迎所有程序员。当我为Android创建应用程序时,我遇到了一个问题。我想以编程方式创建LinearLayout。然后我想用编程方式填充不同的元素。之后我希望获得此LinearLayout的高度以便将来使用它(例如,用于动画),并将其可见性设置为消失。我在OnCreate of Activity中做的所有这些动作,所以如果我尝试获得高度,我得到0。 任何人都可以帮助我。所有建议将不胜感激。
已更新
对于 Gotiasits 和 Abbas 这里的代码
{{1}}
答案 0 :(得分:2)
线性布局需要一些时间来衡量,传递给它的孩子和孩子。正确地得到它的高度。所以你必须等到它完成。这是代码
TRIED IT&工作:JAVA代码
linearLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int height = linearLayout.getMeasuredHeight();
if( Build.VERSION.SDK_INT > 15){
linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
linearLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
});
您为布局设置了一个侦听器,在获得高度后,取消注册GlobalOnLayoutListener
您可以使用linearLayout.getHeight()
或linearLayout.getMeasuredHeight()
。两者都在我的测试中提供了相同的值
XAMARIN代码
ViewTreeObserver vto = _linearLayout.ViewTreeObserver;
vto.GlobalLayout += (sender, args) => {
var ht = linearLayout.Height;
};
答案 1 :(得分:-1)
你最好的猜测可能是,不是试图获得托管(LinearLayout)高度,而是可以获得子项目的高度,并将其乘以托管视图中的项目数。
编辑:以下是可能为您提供所需内容的解决方案。只要能够访问初始化的onCreate()
,就可以在onResume()
和contentContainer
中调用此函数。
public void getHeight(){
contentContainer.post(new Runnable() {
@Override
public void run() {
int sumHeight=0;
for(int i=0; i<contentContainer.getChildCount(); i++){
sumHeight+=contentContainer.getChildAt(i).getHeight();
}
Log.d("vidi", "Layout height = " + sumHeight);
}
});
同样正如Masked Man所指出的那样,如果你的LinearLayout中有一些填充或边距,你可以用ex来获取它们。 contentContainer.getPaddingBottom
并将其添加到总和中。
.post(Runnable)
的目的只是推迟Runnable中的代码,即将此代码排队以在绘制Layout之后运行。