2010-11-13 5 views
23

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

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

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

Благодаря

ответ

39

Override onSizeChanged в вашем View!

+2

Я надеялся на метод, который не требует подклассификации вида, но это работает точно так, как я хотел, спасибо. Чтобы вызвать вызов родительской активности представления, я создал прослушиватель в подклассовом представлении, который вызывает активность, которая была изменена. Еще раз спасибо. – cottonBallPaws

+0

@ dacwe, как остановить изменение размера макета ' – PriyankaChauhan

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 
     } 
    }); 
20

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

+0

Должно быть выбранного ответа –

+0

Это действительно полезно! Умный и красивый :) –