2016-12-19 4 views
0

Я не понял, как вернуть значения из приведенного ниже метода, я попытался вернуть int, но он показывает мне странную ошибку, которую невозможно решить. Это код:Получение значений из 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); 
} 

я понял, что значения не обновляются в методе, потому что, когда я использую метод setText() тогда int значения равны 0.

ответ

0

Вы получаете нули, потому что внутренний-метод не является прежде чем вы установите текст. Значения устанавливаются независимо от того, что они были, когда вы в последний раз их инициализировали.

Задайте текст из обратного вызова.

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 

} 

Или перейти к другому методу.

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

Да, я сделал это, я понял, что значения обновляются внутри метода, но мне нужно, чтобы к целым значениям можно было обращаться из других методов. – AndroidFreak

+0

Доступ к ним можно получить из других методов. Только не до завершения обратного вызова. –

0

Задайте значения, когда вы получаете ширину и высоту 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: Создание полей классов и когда предоставляются новые значения проходят те значения, где они нужны.

Смежные вопросы