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 и как правильно его получить. Благодарю.

  • GSON выбрасывает «Ожидаемый BEGIN_OBJECT, но был BEGIN_ARRAY»?
  • Как Java конвертирует int в байты?
  • Как получить URL из хранилища Firebase getDownloadURL
  • Как изменить десятичный разделитель DecimalFormat от запятой до точки / точки?
  • Jar Mismatch Нашел 2 версии android-support-v4.jar в списке зависимостей
  • Обновление Eclipse с помощью средств разработки Android v. 23
  • Передача нескольких файлов Java через сокет
  • java.lang.numberformatexception: недействительный double: ""
  • Загрузка ресурса из любого места в пути classpath
  • Как программно определить операционную систему на Java?
  • Любые хорошие инструменты ORM для разработки Android?
  • Interesting Posts

    Почему ключевое слово «this» требуется для вызова метода расширения из расширенного classа

    Сделать команды OS X Terminal I type BOLD

    Android, как включить, не беспокоить (dnd) программно

    Как синхронизировать каталоги за пределами каталога Google Диска

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

    Утечка памяти Tomcat Guice / JDBC

    Можно ли перебирать аргументы в переменных массивах?

    Исправлена ​​ошибка «Параметр недействителен» System.Drawing.Image

    Есть ли атрибут проверки минимальной длины в HTML5?

    как получить доступ к Wi-Fi-сетям и отобразить их в списке в android

    Как вручную изменить поставщиков поиска в Windows Internet Explorer 9

    В Excel 2013, где находятся инструменты Visual Basic (VBA), Макросы и AddIn?

    Что на самом деле делает флаг JVM CMSClassUnloadingEnabled?

    Эквивалент окна для dd

    Есть ли способ иметь команду выбора в пакетных файлах – и ждать меньше секунды

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