2014-02-21 184 views
36

我设计了一个布局,其中LinearLayout有两个孩子LinearLayoutFrameLayout,并且在每个孩子中我放置了不同的视图。以编程方式获取布局的高度和宽度

我只是想测量高度和宽度的FrameLayout,以便我可以为我的目的服务。

在程序我使用

int height,width; 

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr); 
height=fr.getHeight(); 
width=fr.getWidth(); 

返回值作为0两个

即使我试图与下面的代码 INT高度,宽度;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr); 
height=fr.getMeasuredHeight(); 
width=fr.getMeasuredWidth(); 

返回相同的值0

最后我试图与下面的代码, INT高度,宽度;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr); 
height=fr.getgetLayoutParams().height(); 
width=fr.getLayoutParams().width; 

返回我-2-1

我想要的解决方案,使编程任何布局的高度和宽度?

+0

看到这个问题 http://stackoverflow.com/questions/3779173/determining-the-size-of-an-android-view-at-runtime – VinhNT

回答

80

的观点本身有它自己的生命周期基本上是如下:

-Attached

-Measured

-layout

-draw

所以,根据你什么时候想要获得宽度/高度,你可能看不到你期望看到的,例如,如果你在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(); 

    } 
}); 

希望它有助于。

问候!

+0

THnx为您的答案....但仍然相同的结果:( – Rohit

+1

请注意,removeGlobalOnLayoutListener已弃用,所以你必须写this.layout。。getViewTreeObserver()removeOnGlobalLayoutListener(本);在最近的android api中。 –

+0

它像一个魅力:) – boctulus

1

第一个片段是正确的,但您需要在onMeasure()之后调用执行。否则,该视图的大小尚未测量。

+0

此外,您可以覆盖onMeasure得到了新的每次调用这个方法时测量的结果。 –

11

我认为你在OnCreate()方法中获得高度和宽度,这就是为什么你始终得到0值,因为那时你的视图还没有创建。

设法得到高度和宽度上的一些按钮,点击不然..

+0

我有几乎相同的问题。我是Android的初学者。那么做什么最好的/方式的地方是什么?目前我在onCreate中创建了几个按钮,并且想要定位它们。哪里是最好的地方去做? –

1

对于框架:

height=fr.getHeight(); 
width=fr.getWidth(); 

对于屏幕:

width = getWindowManager().getDefaultDisplay().getWidth(); 
height = getWindowManager().getDefaultDisplay().getHeight(); 
0

尝试这样的事情代码this链接

ViewTreeObserver viewTreeObserver = view.getViewTreeObserver(); 
if (viewTreeObserver.isAlive()) { 
viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
@Override 
public void onGlobalLayout() { 
    view.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
    viewWidth = view.getWidth(); 
    viewHeight = view.getHeight(); 
} 
}); 
} 

希望这会有所帮助。

0

我用DisplayMetrics获取屏幕尺寸,然后我可以在%年龄宽度/高度指定给一个元素

它会像这样

DisplayMetrics dmetrics = new DisplayMetrics(); 
int widthPixels=dmetrics.widthPixels; 
int heightPixels=dmetrics.heightPixels;  

//setting the height of the button 
button_nextPuzzle.setMinHeight((int) ((heightPixels/3)*.30)); 

为我工作得非常好! !

+0

它不会给你所需的高度'FrameLayout' – Prabs

5

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

7

由于CapDroid,你想哟,如果得出的观点之前获得的大小,另一种可能的解决办法是做一个帖子有一个可运行的查看:

mView.post(new Runnable() { 
     @Override 
     public void run() { 
      int width = mView.getWidth(); 
      int height = mView.getHeight(); 
     } 
} 
1

最简单的方法是使用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(); 

       } 
      }); 
     } 

0

只是给你的身高,如果你想要的话,你会得到高度,甚至宽度。

/** * 获取视图高度视图前将呈现 * @参数查看测量 视图* @返回视图的高度 */

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(); 
} 
0

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

layoutView(view); 

INT高度= 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()); 
} 
相关问题