Как определить размер макета?

Dianne Hackborn упоминается в нескольких потоках, которые вы можете обнаружить, когда макет был изменен, например, когда открыта или закрывается мягкая клавиатура. Такой поток - это один... http://groups.google.com/group/android-developers/browse_thread/thread/d318901586313204/2b2c2c7d4bb04e1b

Однако я не понял ее ответа: "По вашей иерархии просмотров изменяются все соответствующие обходы и обратные вызовы макета".

Есть ли у кого-нибудь дополнительное описание или некоторые примеры того, как это обнаружить? Какие обратные вызовы можно связать, чтобы обнаружить это?

Спасибо

Ответ 2

Один из способов - просмотр. addOnLayoutChangeListener. В этом случае нет необходимости подклассифицировать представление. Но вам нужен уровень API 11. И правильный расчет размера из границ (недокументированный в API) иногда может быть ловушкой. Вот правильный пример:

public void onLayoutChange( View v, int left, int top, int right, int bottom,
  int leftWas, int topWas, int rightWas, int bottomWas )
{
    int widthWas = rightWas - leftWas; // right exclusive, left inclusive
    if( v.getWidth() != widthWas )
    {
        // width has changed
    }
    int heightWas = bottomWas - topWas; // bottom exclusive, top inclusive
    if( v.getHeight() != heightWas )
    {
        // height has changed
    }
}

Другой способ (как ответы dacwe) - подклассировать ваше представление и переопределить onSizeChanged.

Ответ 3

Мое решение состоит в том, чтобы добавить невидимый крошечный немой вид в конце макета/фрагмента (или добавить его как фон), поэтому любое изменение размера макета вызовет событие изменения макета для этого вида, которое могло бы быть нанятым OnLayoutChangeListener:

Пример добавления немого представления в конец макета:

 <View 
    android:id="@+id/theDumbViewId"
    android:layout_width="1dp"
    android:layout_height="1dp"
     />

Слушайте событие:

    View dumbView = mainView.findViewById(R.id.theDumbViewId);
    dumbView.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) {
            // Your code about size changed
        }
    });