Получение значений из addOnPreDrawListener()

Я не понял, как вернуть значения из метода ниже, я пытался вернуть int но это показывает мне странную ошибку, которую невозможно решить. Это код:

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.

2 ответа

Решение

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

Установите текст из обратного вызова.

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

Установите значения, когда вы получите 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);
}

РЕДАКТИРОВАТЬ: создавать поля класса и, когда новые значения предоставляются, передать эти значения, где они вам нужны.

Другие вопросы по тегам