Подтвердить что ты не робот

Почему removeOnGlobalLayoutListener выбрасывает NoSuchMethodError?

У меня есть код, который успешно компилируется с помощью ViewTreeObserver#removeOnGlobalLayoutListener(...), и когда он запускается, этот метод выдает NoSuchMethodError. Почему?

4b9b3361

Ответ 1

В ViewTreeObserver есть два метода с почти одним и тем же именем.

removeOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)

(на, а затем глобальный) - это метод, который был добавлен в API 16. Он заменяет

removeGlobalOnLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)

(глобальный, а затем на), который существует с API 1, но который теперь устарел.

Оба метода могут появляться во время компиляции (если вы создаете против Jellybean или выше), но более новый из них будет работать не на устройствах до Джеллибо.

Этот код препятствует ошибке:

try {
    thing.removeOnGlobalLayoutListener(victim);
} catch (NoSuchMethodError x) {
    thing.removeGlobalOnLayoutListener(victim);
}

Так делает этот код:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
    thing.removeGlobalOnLayoutListener(victim);
} else {
    thing.removeOnGlobalLayoutListener(victim);
}

Ответ 2

Я предполагаю, что вы говорите об removeOnGlobalLayoutListener из класса ViewTreeObserver. Этот метод был добавлен в API уровня 16. Моя лучшая догадка заключается в том, что вы пытаетесь использовать его на устройстве, на котором установлена ​​старая версия Android, поэтому его невозможно найти.

Ответ 3

У меня есть рабочий код

public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){
    if (Build.VERSION.SDK_INT < 16) {
        v.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
    } else {
        v.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
    }
}