如何获取在 xml 中定义为高度和宽度的 fill_parent 的线性布局的宽度和高度?我已经尝试过 onmeasure 方法,但我不知道为什么它没有给出确切的值。在 oncreate 方法完成之前,我需要在 Activity 中使用这些值。
问问题
58732 次
5 回答
37
假设我必须获得LinearLayout
在 XML 中定义的宽度。我必须通过 XML 获得它的参考。定义LinearLayout
l
为实例。
l = (LinearLayout)findviewbyid(R.id.l1);
ViewTreeObserver observer = l.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// TODO Auto-generated method stub
init();
l.getViewTreeObserver().removeGlobalOnLayoutListener(
this);
}
});
protected void init() {
int a= l.getHeight();
int b = l.getWidth();
Toast.makeText(getActivity,""+a+" "+b,3000).show();
}
callfragment();
}
于 2012-08-31T09:15:54.200 回答
5
宽度和高度值是在创建布局后设置的,当放置元素时,它们会被测量。在第一次调用 onSizeChanged 时,参数将为 0,因此如果您使用该检查来检查它。
更多细节在这里 https://groups.google.com/forum/?fromgroups=#!topic/android-developers/nNEp6xBnPiw
在这里http://developer.android.com/reference/android/view/View.html#Layout
以下是如何使用 onLayout:
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int width = someView.getWidth();
int height = someView.getHeight();
}
于 2012-08-22T08:48:47.057 回答
5
要使其工作,您需要检查所需的高度值是否大于 0 - 然后首先删除 onGlobalLayout 侦听器并对高度执行任何您想要的操作。侦听器连续调用它的方法,并且在第一次调用时不能保证正确测量视图。
final LinearLayout parent = (LinearLayout) findViewById(R.id.parentView);
parent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int availableHeight = parent.getMeasuredHeight();
if(availableHeight>0) {
parent.getViewTreeObserver().removeGlobalOnLayoutListener(this);
//save height here and do whatever you want with it
}
}
});
于 2015-08-20T14:20:02.633 回答
3
您可以在布局中添加布局更改侦听器并获取最新的高度和宽度,甚至是上次更改之前的高度和宽度。
在 API 级别 11 中添加
添加一个侦听器,当视图的边界由于布局处理而发生变化时将调用该侦听器。
LinearLayout myLinearLayout = (LinearLayout) findViewById(R.id.my_linear_layout);
myLinearLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
// Preventing extra work because method will be called many times.
if(height == (bottom - top))
return;
height = (bottom - top);
// do something here...
}
});
于 2015-08-10T22:59:35.040 回答
0
基于 MGDroid 对 API 16+ 的回答使用 Kotlin 的通用方法。
/**
* Align height of a container from wrap-content to actual height at runtime.
* */
private fun <T: ViewGroup> alignContainerHeight(container: T) {
container.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
// Obtain runtime height
val availableHeight = container.measuredHeight
if (availableHeight > 0) {
container.viewTreeObserver.removeOnGlobalLayoutListener(this)
setContainerHeight(container, availableHeight)
}
}
})
}
/**
* Note: Assumes that the parent is a LinearLayout.
* */
private fun <T : ViewGroup> setContainerHeight(container: T, availableHeight: Int) {
val availableWidth = container.measuredWidth
val params = LinearLayout.LayoutParams(availableWidth, availableHeight)
// Note: getLayoutParams() returns null if no parent exists
if (container.layoutParams != null) {
container.layoutParams = params
}
}
于 2019-10-05T12:41:18.850 回答