2016-11-24 2 views
7

У меня есть классРазница между addOnLayoutChangeListener и onLayout (изменена)?

public class FancyView extends View implements View.OnTouchListener { 

мне нужно, чтобы получить высоту/ширину зрения.

(Это может измениться, скажем, вращение устройства. Кроме того, конечно, высота/ширина не известна во время инициализации.)

Вы можете сделать это ...

Таким образом, на самом деле в классе FancyView просто переопределить onLayout(changed)

@Override 
protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
    super.onLayout(changed, left, top, right, bottom); 
    int hh = getHeight(); 
    Log.d("~", "Using onLayout(changed), height is known: " +hh); 
} 

Или, вы можете сделать это ...

Снова в классе FancyView использовать addOnLayoutChangeListener

private void init() { 
    addOnLayoutChangeListener(new OnLayoutChangeListener() { 
     @Override 
     public void onLayoutChange(View v, int left, int top, 
            int right, int bottom, int oldLeft, int oldTop, 
            int oldRight, int oldBottom) { 
      Log.d("~", "Using addOnLayoutChangeListener, height is known: " +hh); 
     } 
    }); 

} 

(За исключением:. Я думаю init() это лучшее место, чтобы сделать это)

И, кажется, работает хорошо.

Есть ли какая-либо фактическая разница между (A) добавлением слушателя с addOnLayoutChangeListener и поочередно (B) с переопределением onLayout(boolean changed?

Использование: в пределах класса FancyView Я рисую что-то поверх изображения; поэтому мне нужно знать ширину/высоту, какой размер рисовать.


Сноска. Я заметил, где бы ни обсуждалась проблема «Android, получить ширину/высоту обзора», часто предлагается использовать onWindowFocusChanged 9ах, поскольку это «проще»). Я действительно не понимаю, почему вы это сделаете, когда доступно onLayout (изменено); возможно, я что-то упустил.

+0

Я согласен с вами в том, что метод addOnLayoutChangeListener - это метод, который нужно выполнить. Потому что целью слушателя является информирование другого процесса об изменении события. – ZeusNet

+0

hi @ZeusNet; Спасибо за это. Скажите, вы случайно написали там неправильное? Поскольку, как вы говорите, подход «слушателя» относится к «другим процессам» - не было бы лучше просто использовать onLayout (изменено) здесь в классе? – Fattie

+1

Привет @ joe-blow Я думаю, что использовал бы прослушиватель для обоих. Уведомление стажера и extern. Но это только мое предпочтение.OnLayout также может быть использован для этой нотации, но, на мой взгляд, лучше использовать слушателя, чтобы отделить внимание – ZeusNet

ответ

3

Способ addOnLayoutChangeListener является общедоступным, поэтому он позволяет добавить внешнего прослушивателя изменений. OTOH onLayout защищен, поэтому он предназначен только для внутреннего использования.

Для внутреннего использования я понимаю, что оба метода обеспечивают одинаковый результат, но переопределение немного чище.

Проверка исходного кода для View я вижу, что метод, использующий изменение слушателей

public void layout(int l, int t, int r, int b) 

Этот метод вызова внутри onLayout и изменить слушателей, подтверждающие, что оба метода эквивалентны, так как они вызываются таким же образом. Если есть ситуация, когда они не вызываются одновременно, это может быть вызвано ошибкой реализации управления.

+0

Спасибо за это. Да, переопределение кажется более разумным. Весь пример кода, который я видел, добавляет слушателя: возможно, это только один из тех случаев, когда: вы получаете «плохую идею» в примере кода, и он повторяется снова и снова? Может быть, onLayout (изменено) доступно только недавно в Android? – Fattie

+1

@JoeBlow: добавлено изменение. Проверка исходного кода для 'View', похоже, подтверждает, что оба метода эквивалентны. –

+1

Мне интересно, может ли дополнительный прослушиватель быть немного менее эффективным, чем просто переопределить 'onLayout()', поскольку OP имеет пользовательский вид в любом случае. Но пока у меня очень мало опыта с пользовательскими представлениями. Считаете ли вы, что слушатель будет иметь какое-либо влияние на производительность? – 0X0nosugar

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