Как определить размер макета? - PullRequest
30 голосов
/ 13 ноября 2010

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

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

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

Спасибо

Ответы [ 3 ]

50 голосов
/ 13 ноября 2010

Переопределить onSizeChanged в вашем Представлении !

42 голосов
/ 24 декабря 2015

Одним из способов является View. 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 .

4 голосов
/ 04 ноября 2015

Мое решение состоит в том, чтобы добавить невидимый крошечный тупой вид в конце макета / фрагмента (или добавить его в качестве фона), поэтому любое изменение размера макета вызовет событие изменения макета для этого представления, которое можетбыть захваченным 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
        }
    });
...