2011-10-13 4 views
3

J'ai créé un tableau de boutons. Maintenant, je veux trouver la hauteur et la largeur du bouton, et pour cela j'ai utilisé getWidth() et getHeight(). Mais le fait est que ça revient toujours à 0. Pourquoi cela se passe-t-il? J'ai envoyé mon code, s'il vous plaît vérifier si quelque chose ne va pas.Comment obtenir la hauteur et la largeur du bouton

int x,y; 
    LinearLayout layoutVertical = (LinearLayout) findViewById(R.id.liVLayout); 
    LinearLayout rowLayout = null; 

    LayoutParams param = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1); 

    //Create Button 
    for (int i = 0; i<6; i++) 
    { 
     rowLayout = new LinearLayout(this); 
     rowLayout.setWeightSum(7); 
     layoutVertical.addView(rowLayout, param); 

     for(int j=0; j<7; j++) 
     { 
      m_pBtnDay[i][j] = new Button(this);    

      rowLayout.addView(m_pBtnDay[i][j], param); 

      m_pBtnDay[i][j].setOnLongClickListener(this);       

      m_pBtnDay[i][j].setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL); 
      m_pBtnDay[i][j].setTextSize(12);         
     } 
    } 
    x = m_pBtnDay[i][j].getWidth(); 
    y = m_pBtnDay[i][j].getHeight(); 
    Log.d("width", Integer.toString(x)); 
    Log.d("Height", Integer.toString(y)); 
    return true; 

Répondre

10

probablement vous appellent getWidth() et getHeight() trop tôt: Je pense que l'interface n'a pas été dimensionné et aménagé encore sur l'écran ...
Vous pouvez essayer de mettre ce code dans ceci:

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    // Call here getWidth() and getHeight() 
} 
+0

alors quand je devrais appeler ces fonctions.J'ai passé par de nombreux exemples, mais je ne peux pas obtenir la réponse.peut-on m'aider à résoudre ces problèmes – AndroidDev

+0

@Anshuman: créer dinamically mise en page et laissez-le montrer avant de vérifier la largeur et la hauteur. Dans mon code édité j'ai fourni un exemple, mais je suis sûr que ce n'est pas le seul ... – Marco

+0

@Anshuman: vous ne nous dites pas dans quelle fonction/événement vous appelez votre code ... – Marco

7

Une autre façon

ViewTreeObserver vto = button.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 

     width = button.getWidth(); 
     height = button.getHeight(); 
    } 
}); 
0

Vous essayez d'utiliser le nombre variable "i" et "j" à utiliser en dehors des deux pour-boucles. Cela devrait soulever une exception, car ils ne sont disponibles que dans chaque bloc.

Essayez de faire la sortie dans la seconde boucle for ...

for (int i = 0; i<6; i++) 
{ 
    ... 
    for(int j=0; j<7; j++) 
    { 
     .... 
     x = m_pBtnDay[i][j].getWidth(); 
     y = m_pBtnDay[i][j].getHeight(); 
     Log.d("width", Integer.toString(x)); 
     Log.d("Height", Integer.toString(y)); 
    } 
} 
1

mettre ceci dans votre boucle

x = m_pBtnDay[i][j].getWidth(); 
y = m_pBtnDay[i][j].getHeight(); 
Log.d("width", Integer.toString(x)); 
Log.d("Height", Integer.toString(y)); 

l'essayer

-1

Essayez ceci peut aussi fonctionner:

btn.getDrawingCache().getHeight() and btn.getDrawingCache().getWidth() 
0

Vous pouvez remplacer la méthode View suivante, appelée pendant la phase de mise en page.

protected void onSizeChanged (int w, int h, int oldw, int oldh) 

Cela semble plus approprié, car il représente expressément pour la largeur et la hauteur zéro vous observez:

Ceci est appelé lors de la présentation lorsque la taille de ce point de vue a changé. Si vous venez d'être ajouté à la hiérarchie d'affichage, vous êtes appelé avec les anciennes valeurs 0.

Paramètres w Largeur actuelle de cette vue. h Hauteur actuelle de cette vue . oldw Ancienne largeur de cette vue. oldh Ancienne hauteur de cette vue.

Voir here.

Questions connexes