java布局宽度_以编程方式获取布局的高度和宽度
回答(12)
2 years ago
视图本身,它有自己的生命周期,基本如下:
附上
测量
布局
画画
因此,根据您何时尝试获得宽度/高度,您可能看不到您期望看到的内容,例如,如果您在onCreate期间执行此操作,则另一方面,视图可能甚至无法在此时间进行测量如果你在按钮的onClick方法中这样做,很可能到目前为止该视图已被附加,测量,布局和绘制,因此,您将看到预期值,您应该实现ViewTreeObserver以确保您获得适当时刻的 Value 观 .
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();
}
});
2 years ago
我认为你在OnCreate()方法中获得了高度和宽度,这就是为什么你总是得到0值,因为那时你的视图仍然没有创建 .
尝试通过单击按钮获得高度和宽度,否则..
2 years ago
作为CapDroid,您正在尝试在视图之前获取大小(如果已绘制),另一种可能的解决方案可能是在视图上执行具有runnable的Post:
mView.post(new Runnable() {
@Override
public void run() {
int width = mView.getWidth();
int height = mView.getHeight();
}
}
2 years ago
如果得到-1或-2,它也可以是LayoutParams.WRAP_CONTENT(-2)或LayoutParams.MATCH_PARENT(-1)的数值 .
2 years ago
只要给你的身高,如果需要,你将获得身高甚至宽度 .
/ ** 在视图渲染之前获取视图高度 @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();
}
2 years ago
试试这个方法:
int width = mView.getMeasuredWidth();
int height = mView.getMeasuredHeight();
要么
int width = mTextView.getMeasuredWidth();
int height = mTextView.getMeasuredHeight();
2 years ago
第一个片段是正确的,但你需要调用它来执行 after onMeasure() . 否则,尚未测量视图的大小 .
2 years ago
对于框架:
height=fr.getHeight();
width=fr.getWidth();
对于屏幕:
width = getWindowManager().getDefaultDisplay().getWidth();
height = getWindowManager().getDefaultDisplay().getHeight();
2 years ago
最简单的方法是使用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();
}
});
}
如果你需要在方法上使用它,请像这样使用并保存值,你可以使用全局变量 .
2 years ago
我有同样的问题,但不想在测量之前画在屏幕上,所以我在尝试获得高度和宽度之前使用这种测量视图的方法 .
使用示例:
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());
}
2 years ago
尝试从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();
}
});
}
希望这可以帮助 .
2 years ago
我使用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));
为我工作得很好!!!
还没有评论,来说两句吧...