android 获取一个view的高度,android-以编程方式获取布局的高度和宽度

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值