2016-12-19 1 views
0

Je n'ai pas compris comment retourner les valeurs de la méthode ci-dessous, j'ai essayé de retourner int mais cela me montre une erreur étrange qu'il n'est pas possible de résoudre. Voici le code:Obtenir des valeurs de addOnPreDrawListener()

private void showTheEnemy() { 

    ViewTreeObserver vto = radarImage.getViewTreeObserver(); 
    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
     public boolean onPreDraw() { 
      radarImage.getViewTreeObserver().removeOnPreDrawListener(this); 
      yradar_height = radarImage.getMeasuredHeight(); 
      xradar_width = radarImage.getMeasuredWidth(); 
      return true; 
     } 
    }); 
    coordinateText.setText(yradar_height + " " + xradar_width); 
} 

J'ai compris que les valeurs ne sont pas mises à jour dans la méthode parce que quand j'utilise la méthode setText() alors int valeurs sont 0.

Répondre

0

Vous obtenez des zéros parce que la méthode intérieure n'est pas déclenché avant de définir le texte. Les valeurs sont définies à ce qu'elles étaient lors de leur dernière initialisation.

Définir le texte à partir du rappel.

private TextView coordinateText; 
private int xradar_width = 0; 
private int yradar_height = 0; 

private void showTheEnemy() { 

    ViewTreeObserver vto = radarImage.getViewTreeObserver(); 
    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
     public boolean onPreDraw() { 

      yradar_height = radarImage.getMeasuredHeight(); 
      xradar_width = radarImage.getMeasuredWidth(); 

      coordinateText.setText(String.format("%d %d", 
       yradar_height, 
       xradar_width 
      )); 

      radarImage.getViewTreeObserver().removeOnPreDrawListener(this); 
      return true; 
     } 
    }); 

    // Your values are still 0 here 

} 

Ou passer à une autre méthode.

private TextView coordinateText; 

private void showTheEnemy() { 

    ViewTreeObserver vto = radarImage.getViewTreeObserver(); 
    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
     public boolean onPreDraw() { 

     setCoordinate(coordinateText, 
       radarImage.getMeasuredHeight(), 
       radarImage.getMeasuredWidth())); 
      radarImage.getViewTreeObserver().removeOnPreDrawListener(this); 
      return true; 
     } 
    }); 

} 

private static void setCoordinate(TextView tv, int xPos, int yPos) { 
    tv.setText(String.format("%d %d", xPos, yPos)); 
} 
+0

oui Je l'ai fait, j'ai compris que les valeurs sont mises à jour dans la méthode, mais ce dont j'ai besoin, c'est que l'on puisse accéder aux valeurs entières à partir d'autres méthodes. – AndroidFreak

+0

Vous pouvez y accéder à partir d'autres méthodes. Juste pas après le rappel. –

0

Valeurs de consigne lorsque vous obtenez la largeur et la hauteur radarImage:

private void showTheEnemy() { 
    ViewTreeObserver vto = radarImage.getViewTreeObserver(); 
    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
     public boolean onPreDraw() { 
      radarImage.getViewTreeObserver().removeOnPreDrawListener(this); 
      yradar_height = radarImage.getMeasuredHeight(); 
      xradar_width = radarImage.getMeasuredWidth(); 
      coordinateText.setText(yradar_height + " " + xradar_width); 
      return true; 
     } 
    }); 
    coordinateText.setText(yradar_height + " " + xradar_width); 
} 

EDIT: Créer des champs de classe et lorsque de nouvelles valeurs sont fournies passer ces valeurs là où vous avez besoin.