2010-09-07 4 views
9

Je souhaite déterminer la hauteur et la largeur de la mise en page parente auxquelles je dois ajouter ma vue.Android - get Hauteur de la mise en page parente

J'ai utilisé de nombreuses méthodes sur la mise en page comme

  • layout.getHeight()
  • layout.getRootView(). GetHeight()

Toutes ces méthodes renvoient 0 (zéro) le résultat.

Ma principale exigence est de pouvoir donner de la largeur à une vue qui représente environ% de la largeur de la mise en page.

Aussi, je ne veux pas utiliser de balise pour cela. Je veux le faire à travers le code.

Merci d'avance.

Répondre

5

Le problème ici est que vous essayez d'obtenir la hauteur/poids parent avant que layoutmanager ne termine la mise en page parente. Vous pouvez uniquement obtenir les dimensions parent, une fois la mise en page terminée.

La méthode recommandée pour réaliser ce que vous voulez réaliser est d'utiliser le champ layout_weight de LayoutParams. link text

En particulier, vous devez utiliser:

LayoutParams lp = new LinearLayout.LayoutParams(width, height, 
weight); 

valeur layout_weight peut être comprise entre 0,0 et 1,0. Ainsi, par exemple, si je myButton au sein parentLayout, et je veux myButton occuper 30% de la disposition des parents ... J'utiliser quelque chose comme:

myButton.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
               LayoutParams.WRAP_CONTENT,0.3)); 

La somme layout_weight de tous les éléments de l'enfant doit être 1. De plus, layout_weight ne doit pas être utilisé avec la largeur ou la hauteur de la vue définie sur LayoutParams.FILL_PARENT.

+0

Mais comment obtenir la hauteur et la largeur de la structure parente. ........... LayoutParams lp = new LinearLayout.LayoutParams (largeur, hauteur, poids); ......... Pour donner de la hauteur en%, cette méthode n'est utile que si j'ai des parenthèses de hauteur et de largeur – Robin

+0

Non, vous n'avez pas besoin de connaître la largeur/hauteur exacte du parent pour utiliser cette méthode. Vous pouvez spécifier n'importe quoi entre 0 et 1 comme poids. Donc par exemple si j'ai myButton dans parentLayout, et que myButton doit occuper 30% de la disposition des parents ... J'utiliserais quelque chose comme: –

+0

Désolé, l'espace de commentaire n'a pas suffi ... J'ai édité ma réponse ci-dessus. –

7

Ok. J'ai trouvé une solution à cela. La façon dont nous pouvons obtenir hieght de l'écran de l'activité est

getApplicationContext(). GetResources(). GetDisplayMetrics(). HeightPixels

Mais je ne sais toujours pas comment obtenir les dimentions de pixels de mise en page de parent?

+0

Ce n'est pas toujours pareil. Avec getApplicationContext(). GetResources(). GetDisplayMetrics(). HeightPixels vous obtenez la hauteur de l'écran en pixels. Si vous avez (par exemple) une barre d'action, cela inclut aussi la barre d'action, quelque chose que vous voulez probablement éviter si vous voulez connaître la hauteur en pixels d'une mise en page ou d'un élément d'interface utilisateur (arrière-plan ou autre) – Sotti

2

Une alternative à mettre en œuvre ce programme est d'utiliser la méthode suivante:

public void onWindowFocusChanged(boolean b) { ...} 

Au moment où cette méthode est invoquée, le layouting processus a été terminé. Ainsi, vous pouvez obtenir les attributs parents correctement.

Comme exemple:

public class A extends Activity { 
    LinearLayout parent; 
    Button child; 
    public void onCreate(Bundle b) { 
     parent = (LinearLayout) findViewById(R.id.linear1); 
     child = (Button) findViewById(R.id.button1); 
     . 
     . 
    } 

@Override 
public void onWindowFocusChanged(boolean b) { 
     LayoutParams lpc = child.getLayoutParams(); 
     lpc.width = parent.getWidth(); 
     child.postInvalidate(); 
     . 
     . 
    } 
} 
0

Dans la méthode OnCreate(), si vous utilisez layout.getHeight() et layout.getWidth(), il renvoie 0, au lieu vous pouvez suivre ceci:

public void onClick(View v) { 
    // TODO Auto-generated method stub 

      int layWidth = Layout.getLeft(); 
      int layHeight = Layout.getHeight(); 
     break;  
    } 
+0

'parce que l'interface n'a pas le temps d'être affiché. Il pourrait être préférable d'utiliser une méthode 'Runnable' dans' onCreate' ou d'utiliser ['onWindowFocusChanged'] (http://developer.android.com/reference/android/view/View.html#onWindowFocusChanged%28boolean%29) à l'intérieur l'activité en tant que [Robeth] (http://stackoverflow.com/a/10269753/2668136) mentionné, au lieu d'utiliser un écouteur de clic pour modifier les vues. – Fllo

3

Essayez quelque chose comme ceci:

view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    public void onGlobalLayout() { 
     view.getHeight(); 
    } 
    }); 
0

Vous appelez probablement getHeight() au début. Assurez-vous que getParent().getHeight() est appelé après viewGroup.addView(view0) et/ou setContentView(activity_main.xml). Cela m'est arrivé dans le passé et cela l'a corrigé.