getHeight возвращает 0 для всех объектов Android UI

Я создаю пользовательский интерфейс, и все это статично определено в XML. Все это имеет вес повсюду, и, хотя оно выглядит правильно, я хотел видеть, что на самом деле все имеет правильную высоту и все такое. Проблема в том, что независимо от того, где я называю .getHeight () для моего формата, я получил 0. Я пытался использовать как onCreate (), так и onStart (). То же самое. Случается также для всех объектов пользовательского интерфейса. Есть идеи?

package com.app.conekta; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.Window; import android.widget.Button; import android.widget.FrameLayout; import android.widget.Toast; public class Conekta extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public void onStart() { super.onStart(); } @Override public void onResume() { super.onResume(); FrameLayout fl1 = (FrameLayout) findViewById(R.id.headerFrameLayout); FrameLayout fl2 = (FrameLayout) findViewById(R.id.footerFrameLayout); Button b=(Button) findViewById(R.id.searchButton); Log.d("CONEKTA", String.valueOf(b.getHeight())); } } 

XML:

                       

5 Solutions collect form web for “getHeight возвращает 0 для всех объектов Android UI”

Короче говоря, представления еще не построены в onCreate (), onStart () или onResume (). Поскольку они технически не существуют (что касается ViewGroup), их размеры равны 0.

В течение долгого времени вы можете пойти здесь для лучшего объяснения того, как с этим справиться.

Как получить размеры представления?

Это 0, потому что как в onCreate, так и onStart, на самом деле вид еще не нарисован. Вы можете обойти это, прослушивая, когда изображение действительно нарисовано:

 final TextView tv = (TextView)findViewById(R.id.venueLabel); final ViewTreeObserver observer= tv.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { tv.getHeight() observer.removeGlobalOnLayoutListener(this); } }); 

Вызов для удаления слушателя существует, чтобы предотвратить повторные вызовы вашего пользовательского обработчика при изменении макета … если вы хотите их получить, вы можете его опустить.

Используйте эту функцию, чтобы получить высоту или ширину обзора

 private int getHeightOfView(View contentview) { contentview.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); //contentview.getMeasuredWidth(); return contentview.getMeasuredHeight(); } 

Получив вашу кнопку в режиме просмотра, вы можете легко получить ее высоту и т. Д. Вы можете определить onClickListener следующим образом:

 Button b=(Button) findViewById(R.id.searchButton); b.setOnClickListener(ButtonClick); android.view.View.OnClickListener ButtonClick= new android.view.View.OnClickListener() { public void onClick(View v) { v.getHeight(); }}; 

Надеюсь это поможет.

Я отвечаю на это снова, чтобы убедиться, что такие люди, как я, поймут, как это работает полностью, прежде чем внедрять.

В. Почему я получаю высоту моего представления как 0?
О. Поскольку высота представления, которую вы пытаетесь получить, еще не построена в onCreate (), onStart () или onResume ().

Q. Теперь, где и как я должен получить высоту представления?
О. Вы все равно можете получить параметры вида, где бы вы ни хотели: 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); 

В. Итак, что я должен проверить перед удалением этого слушателя?
** 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 и как правильно его получить. Благодарю.

  • Простой экспорт и импорт базы данных SQLite на Android
  • Параллельная модификация Исключение: добавление в ArrayList
  • Как изменить стиль TextView во время выполнения
  • Почему у RecyclerView нет onItemClickListener ()?
  • Gradle - Что такое ненулевое значение выхода и как его исправить?
  • Настраиваемые виджеты в Android
  • Широковещательный приемник для проверки подключения к Интернету в приложении Android
  • Как поместить банку в classpath в Eclipse?
  • Почему я получаю сообщение «Failed to bounce to type», когда я включаю JSON из Firebase в объекты Java?
  • Android написать в папку sd card
  • Преобразование строки в код
  • Interesting Posts

    Инструменты для получения графического графика вызова функции кода

    WPF привязка событий пользовательского интерфейса к командам в ViewModel

    Переустановите Windows 8 в системе на базе Windows 8 со встроенным ключом

    Что так плохо о одиночных играх?

    В чем разница между модульными тестами и интеграционными тестами?

    Почему стандартные iteratorы диапазона вместо ?

    Как я могу скопировать большое количество файлов с одной машины Ubuntu на другую эффективно?

    Могу ли я запустить win7 на другой машине с другой материнской платой?

    Подключение к Интернету через телефон в Linux

    Сложность с ng-моделью, ng-repeat и входами

    Как извлечь изображения из Word Document из Linux

    Настройка CNTLM для прокси-сервера, требующего базовой аутентификации

    Плохие сектора на жестком диске

    Как заставить Excel открывать второе пустое окно при открытии файла из проводника?

    Избавьтесь от настроек мощности и доступности на экране входа в Windows 8

    Давайте будем гением компьютера.