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