android-以编程方式获取布局的高度和宽度
我设计了一个布局,其中LinearLayout有2个孩子-2和-1,并且在每个孩子中我放置不同的视图。
我只想测量-2的高度和宽度,以便可以实现自己的目的。
在程序中我正在使用
int height,width;
FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getHeight();
width=fr.getWidth();
两者都返回值为-2
即使我尝试了以下代码int高度,宽度
FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getMeasuredHeight();
width=fr.getMeasuredWidth();
返回相同的值-2
最后我尝试了以下代码,int高度,宽度
FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getgetLayoutParams().height();
width=fr.getLayoutParams().width;
返回我-2和-1
我想要解决方案以编程方式获取任何布局的高度和宽度吗?
14个解决方案
122 votes
视图本身具有自己的生命周期,基本上如下:
附上
实测
布局
画
因此,根据您何时尝试获取宽度/高度,您可能看不到预期的显示,例如,如果您在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();
}
});
Martin Cazares answered 2020-02-02T11:59:28Z
19 votes
正如CapDroid所说,您试图在绘制视图之前获取大小,另一种可能的解决方案是在View上执行可运行的Post:
mView.post(new Runnable() {
@Override
public void run() {
int width = mView.getWidth();
int height = mView.getHeight();
}
}
Julian answered 2020-02-02T11:59:48Z
14 votes
我认为您在OnCreate()方法中获得了Height和Width,这就是为什么始终获得0值的原因,因为那时您的视图仍未创建。
尝试通过单击某些按钮来获得高度和宽度,否则。
Niranj Patel answered 2020-02-02T12:00:13Z
6 votes
如果得到-1或-2,则也可能是LayoutParams.WRAP_CONTENT(-2)或LayoutParams.MATCH_PARENT(-1)的数值。
Jean-Baptiste Leduc answered 2020-02-02T12:00:34Z
6 votes
只需给出您的身高,如果需要,您将获得身高甚至宽度。
/ ** *在视图渲染之前获取视图高度 * @param view要测量的视图 * @返回视图的高度 * /
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();
}
Siddhesh Shirodkar answered 2020-02-02T12:00:58Z
3 votes
最简单的方法是使用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();
}
});
}
如果您需要在on方法上使用此方法,请像这样使用并保存值,您可以使用globle变量。
Chathura Jayanath answered 2020-02-02T12:01:24Z
3 votes
尝试使用以下方法:
int width = mView.getMeasuredWidth();
int height = mView.getMeasuredHeight();
要么
int width = mTextView.getMeasuredWidth();
int height = mTextView.getMeasuredHeight();
jmorales answered 2020-02-02T12:01:48Z
3 votes
我遇到了同样的问题,但是不想在测量之前在屏幕上绘制,所以我在尝试获取高度和宽度之前使用了这种测量视图的方法。
使用示例:
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());
}
Asaf answered 2020-02-02T12:02:12Z
2 votes
在Kotlin中,您可以简单地执行以下操作:
fr.post {
height=fr.height
width=fr.width
}
Dan Bray answered 2020-02-02T12:02:32Z
1 votes
第一个代码段是正确的,但是您需要在onMeasure()执行后调用它。 否则,尚未为视图测量尺寸。
sergej shafarenka answered 2020-02-02T12:02:52Z
1 votes
对于框架:
height=fr.getHeight();
width=fr.getWidth();
对于屏幕:
width = getWindowManager().getDefaultDisplay().getWidth();
height = getWindowManager().getDefaultDisplay().getHeight();
Vamshi answered 2020-02-02T12:03:16Z
0 votes
从此链接尝试类似此代码的内容
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();
}
});
}
希望这可以帮助。
i.n.e.f answered 2020-02-02T12:03:41Z
0 votes
我使用DisplayMetrics来获取屏幕尺寸,然后可以将宽度/高度分配给以%age为单位的元素
就像这样
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));
为我工作得很好!!!
chetan answered 2020-02-02T12:04:09Z
0 votes
当我刚遇到这个问题时,以为我会为kotlin编写它,
my_view.viewTreeObserver.addOnGlobalLayoutListener {
// here your view is measured
// get height using my_view.height
// get width using my_view.width
}
要么
my_view.post {
// here your view is measured
// get height using my_view.height
// get width using my_view.width
}
Aziz answered 2020-02-02T12:04:34Z