Я отвечаю на это еще раз, чтобы убедиться, что такие люди, как я, поймут, как это работает полностью, прежде чем внедрять.
Q.Почему я получаю высоту моего представления как 0?
A. Поскольку высота представления, которую вы пытаетесь получить, еще не встроена в onCreate (), onStart () или onResume ().
Q.Теперь, где и как я должен получить высоту представления?
A. Вы все еще можете получить параметры представления там, где вы хотите, например, onCreate (), onStart () или onResume.().Как показано ниже:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = (TextView)findViewById(R.id.textview1);
ViewTreeObserver viewTreeObserver = tv.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
viewHeight = tv.getHeight();
}
});
}
}
Однако на этот раз вы будете ждать, пока не получите высоту вида, прежде чем удалять наблюдателя.
tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Q.Так что я должен проверить перед удалением этого слушателя?
** A. ** Просто поставьте условие if перед удалением типа treeObserver,
if (viewHeight != 0)
tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Окончательный код:
ViewTreeObserver viewTreeObserver = tv.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int viewHeight = tv.getHeight();
if (viewHeight != 0)
tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
}
Надеюсь, это объясняет, почему getHeight возвращает 0 и как правильно его получить.Спасибо.