studio programacion para herramientas desarrollo con avanzado aplicaciones java android android-layout framelayout

java - programacion - getHeight devuelve 0 para todos los objetos de la interfaz de usuario de Android



manual android studio avanzado (5)

Estoy construyendo una interfaz de usuario, y está todo estático definido en el XML. Todo tiene pesas en todo el lugar, y aunque se ve bien, quería ver que las cosas en realidad tienen la altura correcta y todo. El problema es que no importa a dónde llame .getHeight () para mi formato de formato, obtuve 0. Intenté tanto onCreate () como onStart (). La misma cosa. Ocurre para todos los objetos UI también. ¿Alguna idea?

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:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <FrameLayout android:id="@+id/headerFrameLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.05" android:background="#597eAA" > <ImageView android:id="@+id/logoImage" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#7ba1d1" android:src="@drawable/logo_conekta" /> </FrameLayout> <LinearLayout android:id="@+id/bodyLinearLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.7" android:background="#f3f3f3" android:orientation="horizontal" > <FrameLayout android:id="@+id/leftBlankFrameLayout" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="0.15" android:background="#f3f3f3" > </FrameLayout> <LinearLayout android:id="@+id/centerVerticalLayout" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="0.7" android:orientation="vertical" > <FrameLayout android:id="@+id/topCenterFrameLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.35" > </FrameLayout> <TextView android:id="@+id/venueLabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0.025" android:text="What are you looking for?" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="#000000" /> <EditText android:id="@+id/venueTextField" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.025" > <requestFocus /> </EditText> <FrameLayout android:id="@+id/middleCenterFrameLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.05" > </FrameLayout> <TextView android:id="@+id/locationLabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0.025" android:text="Where?" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="#000000" /> <AutoCompleteTextView android:id="@+id/locationTextField" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.025" android:text="" /> <LinearLayout android:id="@+id/buttonLinearLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.05" android:background="#f3f3f3" android:orientation="horizontal" > <FrameLayout android:id="@+id/leftButtonLinearLayout" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="0.1" > </FrameLayout> <Button android:id="@+id/searchButton" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="0.8" android:background="#6fa8dc" android:text="Search" /> <FrameLayout android:id="@+id/rightButtonLinearLayout" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="0.1" > </FrameLayout> </LinearLayout> <FrameLayout android:id="@+id/bottomCenterFrameLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.35" > </FrameLayout> </LinearLayout> <FrameLayout android:id="@+id/rightBlankFrameLayout" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="0.15" android:background="#f3f3f3" > </FrameLayout> </LinearLayout> <FrameLayout android:id="@+id/footerFrameLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.15" android:background="#7ba1d1" > </FrameLayout> </LinearLayout>


Al obtener su botón en una Vista, puede obtener su altura fácilmente, etc. Puede definir un onClickListener manera:

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(); }};

Espero que esto ayude.


En resumen, las vistas aún no están compiladas en onCreate (), onStart () o onResume (). Como técnicamente no existen (en lo que respecta al grupo de vistas), sus dimensiones son 0.

En largo, puede ir aquí para una mejor explicación sobre cómo manejarlo.

¿Cómo recuperar las dimensiones de una vista?


Es 0 porque en onCreate y onStart, la vista no se ha dibujado todavía. Puede evitar esto escuchando cuando la vista se dibuja realmente:

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); } });

La llamada para eliminar el oyente está allí para evitar invocaciones repetidas de su controlador personalizado en los cambios de diseño ... si desea obtenerlos, puede omitirlos.


Estoy respondiendo esto de nuevo para asegurarme de que las personas como yo comprendan cómo funciona completamente antes de implementar.

P. ¿Por qué obtengo la altura de mi vista como 0?
A. Porque la altura de la vista que está tratando de obtener aún no está incorporada enCreate (), onStart () o onResume ().

P: ¿Ahora dónde y cómo se supone que voy a obtener la altura de la vista?
R. Todavía puede obtener los parámetros de la vista donde desee, como onCreate (), onStart () o onResume (). Como abajo:

@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(); } }); } }

Sin embargo, esta vez esperará hasta obtener la altura de la vista antes de eliminar el observador.

tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);

P. Entonces, ¿qué debo verificar antes de eliminar este oyente?
** A. ** Simplemente ponga una condición if antes de eliminar treeObserver,

if (viewHeight != 0) tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);

Código final:

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); } }); }

Espero que esto explique por qué el getHeight devuelve 0 y cómo obtenerlo correctamente. Gracias.


Utilice esta función para obtener la altura o el ancho de la vista

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