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

回答(12)

e15298c6a3b4591803e154ab0c3b3e2e.png

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

}

});

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

尝试通过单击按钮获得高度和宽度,否则..

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

作为CapDroid,您正在尝试在视图之前获取大小(如果已绘制),另一种可能的解决方案可能是在视图上执行具有runnable的Post:

mView.post(new Runnable() {

@Override

public void run() {

int width = mView.getWidth();

int height = mView.getHeight();

}

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

e15298c6a3b4591803e154ab0c3b3e2e.png

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

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

试试这个方法:

int width = mView.getMeasuredWidth();

int height = mView.getMeasuredHeight();

要么

int width = mTextView.getMeasuredWidth();

int height = mTextView.getMeasuredHeight();

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

第一个片段是正确的,但你需要调用它来执行 after onMeasure() . 否则,尚未测量视图的大小 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

对于框架:

height=fr.getHeight();

width=fr.getWidth();

对于屏幕:

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

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

e15298c6a3b4591803e154ab0c3b3e2e.png

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

}

});

}

如果你需要在方法上使用它,请像这样使用并保存值,你可以使用全局变量 .

e15298c6a3b4591803e154ab0c3b3e2e.png

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

}

e15298c6a3b4591803e154ab0c3b3e2e.png

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

}

});

}

希望这可以帮助 .

e15298c6a3b4591803e154ab0c3b3e2e.png

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

为我工作得很好!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值