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

我devise了一个布局,其中LinearLayout有两个孩子LinearLayoutFrameLayout并在每个孩子我把不同的意见。

我只是想测量FrameLayout高度和宽度,以便我可以达到我的目的。

在我正在使用的程序中

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

为两者返回值为0

即使我试着用下面的代码int height,width;

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

返回相同的值0

最后我试着用下面的代码,int height,width;

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

返回我-2-1

我想要解决scheme以编程方式获得任何布局的高度和宽度?

Solutions Collecting From Web of "以编程方式获取布局的高度和宽度"

这个观点本身就有自己的生命周期,基本上如下:

-Attached

-Measured

-布局

-画

所以,根据你什么时候想要得到宽度/高度,你可能看不到你期望看到的东西,例如,如果你在onCreate期间这样做,那么视图可能甚至没有在那个时间被测量,另一方面如果你在button的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(); } }); 

希望能帮助到你。

问候!

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

尝试获得一些button点击或其他的高度和宽度..

作为CapDroid,你正在尝试哟获取视图之前,如果绘制的大小,另一个可能的解决办法可能是在视图上运行一个可运行的Post:

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

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

第一个片段是正确的,但是你需要 onMeasure()被执行调用它。 否则,视图的大小还没有被测量。

对于框架:

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

对于屏幕:

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

从这个链接尝试像这样的代码

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

希望这可以帮助。

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

如果你需要在方法上使用这个,就像这样使用,并保存你可以使用全局variables的值。

我使用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)); 

为我工作得非常好!

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

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

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

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

使用示例:

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