以编程方式获取布局的高度和宽度

Roh*_*hit 50 android android-layout

我已经设计在其中的布局LinearLayout有2个孩子LinearLayout,并FrameLayout和每个孩子,我把不同的意见.

我只想测量高度和宽度,FrameLayout这样我才能达到我的目的.

在我正在使用的程序中

int height,width;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getHeight();
width=fr.getWidth();
Run Code Online (Sandbox Code Playgroud)

返回0两者的 值

即使我尝试使用以下代码int height,width;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getMeasuredHeight();
width=fr.getMeasuredWidth();
Run Code Online (Sandbox Code Playgroud)

返回相同的值 0

最后我尝试使用以下代码,int height,width;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getgetLayoutParams().height();
width=fr.getLayoutParams().width;
Run Code Online (Sandbox Code Playgroud)

返回我-2-1

我希望解决方案以编程方式获取任何布局的高度和宽度?

Mar*_*res 125

视图本身,它有自己的生命周期,基本如下:

  • 测量

  • 布局

因此,根据您何时尝试获得宽度/高度,您可能看不到您期望看到的内容,例如,如果您在onCreate期间执行此操作,则另一方面,该视图可能甚至不会被测量如果你在按钮的onClick方法中这样做,很可能到目前为止该视图已被附加,测量,布局和绘制,因此,您将看到预期值,您应该实现ViewTreeObserver以确保您获得适当时刻的价值观.

LinearLayout layout = (LinearLayout)findViewById(R.id.YOUD VIEW ID);
ViewTreeObserver vto = layout.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                this.layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            } else {
                this.layout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            } 
        int width  = layout.getMeasuredWidth();
        int height = layout.getMeasuredHeight(); 

    } 
});
Run Code Online (Sandbox Code Playgroud)

  • 请注意,不推荐使用removeGlobalOnLayoutListener,因此您必须编写this.layout.getViewTreeObserver().removeOnGlobalLayoutListener(this); 在最近的android api中. (4认同)

Jul*_*ian 20

作为CapDroid,你正在尝试在视图之前获取大小(如果绘制),另一种可能的解决方案是在视图上执行带有runnable的Post:

mView.post(new Runnable() {
        @Override
        public void run() {
            int width = mView.getWidth();
            int height = mView.getHeight();
        }
}
Run Code Online (Sandbox Code Playgroud)


Sch*_*ude 16

只是想在这里添加一个答案,因为 Koltin 有一些方便的方法来做到这一点,这比添加和删除 a 少得多onGlobalLayoutListener

view.doOnLayout {
    it.measuredWidth
    it.measuredHeight
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看更多便利方法。

  • 像魅力一样工作。谢谢你,你让我很开心 (2认同)

Nir*_*tel 14

我认为你在OnCreate()方法中得到高度和宽度,这就是为什么你总是得到0值,因为那时你的视图仍然没有创建.

尝试通过点击某个按钮获得高度和宽度,否则..


Dan*_*ray 9

在 Kotlin 中,您可以简单地执行以下操作:

fr.post {
    height=fr.height
    width=fr.width
}
Run Code Online (Sandbox Code Playgroud)


小智 6

如果得到-1或-2,它也可以是LayoutParams.WRAP_CONTENT(-2)或LayoutParams.MATCH_PARENT(-1)的数值.


Sid*_*kar 6

只需给出您的身高,如果需要,您将获得身高甚至宽度。

/ ** *在渲染视图之前获取视图高度* @param查看要测量的视图* @返回视图的高度* /

public static int getViewHeight(View view) {
    WindowManager wm =
            (WindowManager) view.getContext().getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();

    int deviceWidth;

    if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2){
        Point size = new Point();
        display.getSize(size);
        deviceWidth = size.x;
    } else {
        deviceWidth = display.getWidth();
    }

    int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(deviceWidth, View.MeasureSpec.AT_MOST);
    int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
    view.measure(widthMeasureSpec, heightMeasureSpec);
    return view.getMeasuredHeight(); //        view.getMeasuredWidth();
}
Run Code Online (Sandbox Code Playgroud)


小智 5

最简单的方法是使用 ViewTreeObserver,如果直接使用 .height 或 .width,您得到的值为 0,因为视图在绘制到屏幕上之前没有大小。下面的例子将展示如何使用ViewTreeObserver

ViewTreeObserver viewTreeObserver = YOUR_VIEW_TO_MEASURE.getViewTreeObserver();
        if (viewTreeObserver.isAlive()) {
            viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {

                    YOUR_VIEW_TO_MEASURE.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    int viewHeight = YOUR_VIEW_TO_MEASURE.getHeight();
                    int viewWeight = YOUR_VIEW_TO_MEASURE.getWidth();

                }
            });
        }
Run Code Online (Sandbox Code Playgroud)

如果您需要在方法上使用此方法,请像这样使用并保存可以使用全局变量的值。


小智 5

我有同样的问题,但不想在测量之前在屏幕上绘制,所以我在尝试获取高度和宽度之前使用了这种测量视图的方法。

使用示例:

layoutView(view);
int height = view.getHeight();

//...

void layoutView(View view) {
    view.setDrawingCacheEnabled(true);
    int wrapContentSpec = 
        MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
    view.measure(wrapContentSpec, wrapContentSpec);
    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
}
Run Code Online (Sandbox Code Playgroud)