Android获取片段中的布局高度和宽度
我正在处理一个片段,我想获得Android获取片段中的布局高度和宽度,android,layout,fragment,dimension,Android,Layout,Fragment,Dimension,我正在处理一个片段,我想获得xml片段布局中包含的布局的维度。 当我尝试代码时 RelativeLayout myLayout = view.findViewById(R.id.myLayout); myLayout.getHeight(); 它返回0。 我需要这些尺寸来放置我的布局和其他对象 我尝试使用: myLayout.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLa
xml
片段布局中包含的布局的维度。
当我尝试代码时
RelativeLayout myLayout = view.findViewById(R.id.myLayout);
myLayout.getHeight();
它返回0。
我需要这些尺寸来放置我的布局和其他对象
我尝试使用:
myLayout.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener(){
@Override
public void onGlobalLayout() {
mHeight = myLayout.getHeight();
mWidth= myLayout.getWidth();
System.out.println("width: "+mWidth+" height: "+mHeight);
}
});
但是这段代码需要调用很多时间,我不知道它是在什么时候执行的。
我需要将这些维度放到activitycreated()方法的public void中。可能吗 在创建的活动中,尚未测量视图
所以不,你不能从那里得到测量值onGlobalLayout
是一个很好的地方。布局在测量之后直接发生
如果只想删除一次侦听器,可以在以后删除它。请注意,布局可以改变大小(例如,出现软键盘)只要视图发生微小更改,就会调用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);
}
有一个更简洁的解决方案,只需在片段的根视图上使用View.post()
方法,您就可以调用getmeasuredheath()/getMeasuredWidth()
并获取实际值
例如
非常整洁,没有乱七八糟地乱搞ViewTreeObserver
我只在android-23设备上测试过这种方法,但API从1级开始就有了这种方法
无论如何,WFM。什么是myLayout..提到codeIt是XMLpost myLayout xml文件中声明的相对布局的引用,您找到了任何解决方案吗?如果您需要从fragment类而不是从activity@FernandoGallego否,在创建的视图中,宽度和高度返回0。
if (myLayout.getHeight()>0 && myLayout.getWidth()>0) {
// Do some code...
removeOnGlobalLayoutListener(..)
}
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.myfragment, container, false);
root.post(new Runnable() {
@Override
public void run() {
// for instance
int height = root.getMeasuredHeight();
}
});
return root;
}