我正在处理一个片段,我想获得layout
xml
中包含的fragment layout
维度。
当我尝试代码时
RelativeLayout myLayout = view.findViewById(R.id.myLayout);
myLayout.getHeight();
它返回0。 我需要将这些尺寸放入myLayout其他对象中。
我尝试使用:
myLayout.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener(){
@Override
public void onGlobalLayout() {
mHeight = myLayout.getHeight();
mWidth= myLayout.getWidth();
System.out.println("width: "+mWidth+" height: "+mHeight);
}
});
但是这段代码调用了很多时间,我不确切知道它何时执行。
我需要将这些维度纳入public void onActivityCreated ()
方法。可能吗?
答案 0 :(得分:18)
这是一个更清晰的解决方案,只需在片段的根视图中使用View.post()方法,然后调用getMeasuredHeight()/ getMeasuredWidth()并获取实际值。 / p>
E.g。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
View root=inflater.inflate(R.layout.myfragment, container, false);
root.post(new Runnable() {
@Override
public void run() {
int height=root.getMeasuredHeight(); // for instance
}
}
}
使用ViewTreeObserver非常整洁,没有杂乱无章。
我只使用android-23设备对此进行了测试,但API从1级开始就使用了此方法。
无论如何,WFM。
答案 1 :(得分:10)
每当视图发生微小变化时,都会调用addOnGlobalLayoutListener。因此,您需要从视图中删除此侦听器。
简单用法:
public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){
if (Build.VERSION.SDK_INT < 16) {
v.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
} else {
v.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
}
}
我建议你查一下:
if (myLayout.getHeight()>0 && myLayout.getWidth()>0) {
// Do some code...
removeOnGlobalLayoutListener(..)
}
答案 2 :(得分:1)
在onActivityCreated
中,视图尚未测量。
所以不,你不能从那里得到测量结果。 onGlobalLayout
是一个很好的地方。布局在测量后直接发生。
如果您只想执行一次,则可以在之后删除您的侦听器。请注意,布局可以改变大小(例如,出现软键盘)