web-dev-qa-db-fra.com

getHeight renvoie 0 pour tous les objets Android UI

Je construis une interface utilisateur, et tout est statique défini dans le XML. Tout cela a des poids partout, et même si ça a l'air bien, je voulais voir que les choses ont vraiment la bonne hauteur et tout. Le problème est que peu importe où j'appelle .getHeight () pour ma disposition de format, j'ai 0. J'ai essayé à la fois dans onCreate () et onStart (). Même chose. Cela se produit également pour tous les objets d'interface utilisateur. Une idée?

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>
64
Alex B

En bref, les vues ne sont pas encore construites dans onCreate (), onStart () ou onResume (). Puisqu'elles n'existent pas techniquement (en ce qui concerne le ViewGroup), leurs dimensions sont 0.

En long, vous pouvez aller ici pour une meilleure explication sur la façon de le gérer.

Comment récupérer les dimensions d'une vue?

40
DeeV

C'est 0 parce que dans onCreate et onStart, la vue n'a pas encore été dessinée. Vous pouvez contourner cela en écoutant quand la vue est réellement dessinée:

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

L'appel à supprimer l'écouteur est là pour empêcher les invocations répétées de votre gestionnaire personnalisé sur les modifications de mise en page ... si vous voulez les obtenir, vous pouvez l'omettre.

82
Chris

Utilisez cette fonction pour obtenir la hauteur ou la largeur de vue

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

Je réponds à nouveau à cette question pour m'assurer que les gens comme moi comprendront comment cela fonctionne complètement avant de l'implémenter.

Q. Pourquoi la hauteur de ma vue est-elle de 0?
A. Parce que la hauteur de la vue que vous essayez d'obtenir n'est pas encore intégrée dans onCreate (), onStart () ou onResume ().

Q. Maintenant, où et comment suis-je censé obtenir la hauteur de la vue?
A. Vous pouvez toujours obtenir les paramètres de la vue où vous le souhaitez, onCreate (), onStart () ou onResume (). Comme ci-dessous:

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

            }
        });
      }
   }

Cependant, cette fois, vous attendrez d'avoir la hauteur de la vue avant de retirer l'observateur.

tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);

Q. Alors, que dois-je vérifier avant de supprimer cet écouteur?
** A. ** Il suffit de mettre une condition if avant de supprimer treeObserver comme,

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

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

                }
            });
        }

J'espère que cela explique pourquoi le getHeight renvoie 0 et comment l'obtenir correctement. Merci.

3
Vijay E

En plaçant votre bouton dans une vue, vous pouvez facilement récupérer sa hauteur, etc. Vous pouvez définir un onClickListener comme ceci:

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

J'espère que cela t'aides.

1
Abhilab Das