GetWidth () и getHeight () вида возвращают 0

У сканера есть метод, называемый hasNext ():

    Scanner scanner = new Scanner(System.in);

    while(scanner.hasNext())
    {
        System.out.println(scanner.nextInt());
    }
474
задан patrickf 8 December 2017 в 14:01
поделиться

4 ответа

Вы вызываете getWidth() слишком рано. Размер пользовательского интерфейса еще не определен и не размещен на экране.

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

При этом вы можете использовать ресурс измерения для определения размера кнопки, а затем ссылаться на этот ресурс измерения из файла макета и исходного кода, чтобы избежать этой проблемы.

184
ответ дан 22 November 2019 в 22:43
поделиться

Возможно, это помогает кому-то:

Создают дополнительную функцию для имени файла класса

Представления: ViewExt.kt

fun View.afterLayout(what: () -> Unit) {
    if(isLaidOut) {
        what.invoke()
    } else {
        viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
            override fun onGlobalLayout() {
                viewTreeObserver.removeOnGlobalLayoutListener(this)
                what.invoke()
            }
        })
    }
}

Это может затем использоваться на любом представлении с:

view.afterLayout {
    do something with view.height
}
2
ответ дан 22 November 2019 в 22:43
поделиться

AndroidX имеет несколько дополнительных функций, которые помогают Вам с этим видом работы, в androidx.core.view

необходимо использовать Kotlin для этого.

тот, который лучше всего соответствует здесь, doOnLayout:

Выполняет данное действие, когда это представление размечается. Если представление было размечено, и оно не запросило расположение, действие будет выполнено немедленно иначе, действие будет выполнено после того, как представление затем размечается.

действие будет только вызвано однажды на следующем расположении и затем удалено.

В Вашем примере:

bt.doOnLayout {
    val ra = RotateAnimation(0,360,it.width / 2,it.height / 2)
    ... more code
}

Зависимость: androidx.core:core-ktx:1.0.0

1
ответ дан 22 November 2019 в 22:43
поделиться

Это происходит, потому что для представления нужно больше времени, которое будет расширено. Таким образом вместо того, чтобы звонить view.width и view.height на основном потоке, необходимо использовать view.post { ... }, чтобы удостовериться, что Ваш view был уже расширен. В Kotlin:

view.post{width}
view.post{height}

В Java можно также назвать getWidth() и getHeight() методы в Runnable и передать Runnable [1 110] метод.

view.post(new Runnable() {
        @Override
        public void run() {
            view.getWidth(); 
            view.getHeight();
        }
    });
0
ответ дан 22 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: