在运行时获取布局高度和宽度android

时间:2012-08-22 08:15:00

标签: android-layout

如何获得线性布局的宽度和高度,该布局在xml中定义为fill_parent的高度和宽度?我试过onmeasure方法,但我不知道为什么它没有给出确切的价值。在oncreate方法完成之前,我需要在Activity中使用这些值。

6 个答案:

答案 0 :(得分:35)

假设我必须在XML中定义LinearLayout宽度。我必须通过XML来引用它。将LinearLayout l定义为实例。

 l = (LinearLayout)findviewbyid(R.id.l1);
ViewTreeObserver observer = l.getViewTreeObserver();
        observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

            @Override
            public void onGlobalLayout() {
                // TODO Auto-generated method stub
                init();
            l.getViewTreeObserver().removeGlobalOnLayoutListener(
                    this);
        }
    });

protected void init() {
        int a= l.getHeight();
            int b = l.getWidth();
Toast.makeText(getActivity,""+a+" "+b,3000).show();
    } 
    callfragment();
}  

答案 1 :(得分:5)

在创建布局后设置宽度和高度值,放置元素后再进行测量。在第一次调用onSizeChanged时,parms将为0,因此如果您使用该检查。

这里的细节更多 https://groups.google.com/forum/?fromgroups=#!topic/android-developers/nNEp6xBnPiw

http://developer.android.com/reference/android/view/View.html#Layout

以下是如何使用onLayout:

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    int width = someView.getWidth();
    int height = someView.getHeight();
}

答案 2 :(得分:4)

要使其正常工作,您需要检查所需的高度值是否大于0 - 然后首先删除onGlobalLayout侦听器并使用高度执行任何操作。监听器连续调用其方法,并且通过第一次调用不能保证视图被正确测量。

    final LinearLayout parent = (LinearLayout) findViewById(R.id.parentView);
    parent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int availableHeight = parent.getMeasuredHeight();
            if(availableHeight>0) {
                parent.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                //save height here and do whatever you want with it
            }
        }
    });

答案 3 :(得分:3)

您可以在布局中添加布局更改侦听器,并获得最新的高度和宽度,甚至是最后一次更改之前的那个。

  

在API级别11中添加

     

添加一个在视图边界发生变化时将被调用的侦听器   由于布局处理。

LinearLayout myLinearLayout = (LinearLayout) findViewById(R.id.my_linear_layout);
myLinearLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
            // Preventing extra work because method will be called many times.
            if(height == (bottom - top))
                return;

            height = (bottom - top);
            // do something here...
           }
     });

答案 4 :(得分:0)

基于MGDroid针对API 16+的答案,使用Kotlin的通用方法。

/**
 * Align height of a container from wrap-content to actual height at runtime.
 * */
private fun <T: ViewGroup> alignContainerHeight(container: T) {
    container.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
        override fun onGlobalLayout() {

            // Obtain runtime height
            val availableHeight = container.measuredHeight

            if (availableHeight > 0) {
                container.viewTreeObserver.removeOnGlobalLayoutListener(this)
                setContainerHeight(container, availableHeight)
            }
        }
    })
}

/**
 * Note: Assumes that the parent is a LinearLayout.
 * */
private fun <T : ViewGroup> setContainerHeight(container: T, availableHeight: Int) {
    val availableWidth = container.measuredWidth
    val params = LinearLayout.LayoutParams(availableWidth, availableHeight)

    // Note: getLayoutParams() returns null if no parent exists
    if (container.layoutParams != null) {
        container.layoutParams = params
    }
}

答案 5 :(得分:0)

它适用于我的项目:

DisplayMetrics displaymetrics = new DisplayMetrics();
        WindowManager windowManager = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE);
        windowManager.getDefaultDisplay().getMetrics(displaymetrics);
        height = displaymetrics.heightPixels;
        width = displaymetrics.widthPixels;