Roh*_*hit 50 android android-layout
我已经设计在其中的布局LinearLayout有2个孩子LinearLayout,并FrameLayout和每个孩子,我把不同的意见.
我只想测量高度和宽度,FrameLayout这样我才能达到我的目的.
在我正在使用的程序中
int height,width;
FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getHeight();
width=fr.getWidth();
Run Code Online (Sandbox Code Playgroud)
返回0两者的 值
即使我尝试使用以下代码int height,width;
FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getMeasuredHeight();
width=fr.getMeasuredWidth();
Run Code Online (Sandbox Code Playgroud)
返回相同的值 0
最后我尝试使用以下代码,int height,width;
FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getgetLayoutParams().height();
width=fr.getLayoutParams().width;
Run Code Online (Sandbox Code Playgroud)
返回我-2和-1
我希望解决方案以编程方式获取任何布局的高度和宽度?
Mar*_*res 125
视图本身,它有自己的生命周期,基本如下:
附
测量
布局
画
因此,根据您何时尝试获得宽度/高度,您可能看不到您期望看到的内容,例如,如果您在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();
}
});
Run Code Online (Sandbox Code Playgroud)
Jul*_*ian 20
作为CapDroid,你正在尝试在视图之前获取大小(如果绘制),另一种可能的解决方案是在视图上执行带有runnable的Post:
mView.post(new Runnable() {
@Override
public void run() {
int width = mView.getWidth();
int height = mView.getHeight();
}
}
Run Code Online (Sandbox Code Playgroud)
Sch*_*ude 16
只是想在这里添加一个答案,因为 Koltin 有一些方便的方法来做到这一点,这比添加和删除 a 少得多onGlobalLayoutListener:
view.doOnLayout {
it.measuredWidth
it.measuredHeight
}
Run Code Online (Sandbox Code Playgroud)
您可以在此处查看更多便利方法。
在 Kotlin 中,您可以简单地执行以下操作:
fr.post {
height=fr.height
width=fr.width
}
Run Code Online (Sandbox Code Playgroud)
只需给出您的身高,如果需要,您将获得身高甚至宽度。
/ ** *在渲染视图之前获取视图高度* @param查看要测量的视图* @返回视图的高度* /
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();
}
Run Code Online (Sandbox Code Playgroud)
小智 5
最简单的方法是使用 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();
}
});
}
Run Code Online (Sandbox Code Playgroud)
如果您需要在方法上使用此方法,请像这样使用并保存可以使用全局变量的值。
小智 5
我有同样的问题,但不想在测量之前在屏幕上绘制,所以我在尝试获取高度和宽度之前使用了这种测量视图的方法。
使用示例:
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());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
83301 次 |
| 最近记录: |