Получить высоту и ширину макета во время работы андроида
Как получить ширину и высоту линейного макета, который определяется в xml как fill_parent как по высоте, так и по ширине? Я пробовал метод onmeasure, но я не знаю, почему он не дает точной стоимости. Мне нужны эти значения в методе Activity before oncreate.
Ответы
Ответ 1
Предположим, мне нужно получить ширину 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();
}
Ответ 2
Значения ширины и высоты устанавливаются после создания макета, когда элементы были помещены, они затем измеряются. При первом вызове onSizeChanged parms будет 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();
}
Ответ 3
Чтобы заставить его работать, вам нужно проверить, больше ли желаемое значение высоты больше 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
}
}
});
Ответ 4
Вы можете добавить в свой макет планировщик изменений макета и получить самую новую высоту и ширину или даже до последнего изменения.
Добавлен в уровень 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...
}
});
Ответ 5
Общий подход с использованием Kotlin, основанный на ответе MGDroid для API 16+.
/**
* 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
}
}