view.addOnLayoutChangeListener( new View.OnLayoutChangeListener()
{
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
}
}
});
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
}
});
String TAG="toto";
///and last listen for size changed
YourView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v,
int left, int top, int right, int bottom,
int oldLeft, int oldTop, int oldRight, int oldBottom) {
boolean widthChanged = (right-left) != (oldRight-oldLeft);
if( widthChanged )
{
// width has changed
Log.e(TAG,"Width has changed new width is "+(right-left)+"px");
}
boolean heightChanged = (bottom-top) != (oldBottom-oldTop);
if( heightChanged)
{
// height has changed
Log.e(TAG,"height has changed new height is "+(bottom-top)+"px");
}
}
});
7条答案
按热度按时间o8x7eapl1#
一种方法是View.addOnLayoutChangeListener。在这种情况下,不需要子类化视图。但是您需要API级别11。并且根据边界(API中没有说明)正确计算大小有时可能是一个陷阱。下面是一个正确的示例:
另一种方法(正如dacwe所回答的)是将视图子类化并覆盖onSizeChanged。
6kkfgxo02#
覆盖View中的大小更改!
cl25kdpy3#
使用Kotlin分机:
这样使用:
qeeaahzv4#
我的解决方案是在布局/片段的末尾添加一个不可见的小哑视图(或者将其添加为背景),因此布局大小的任何更改都将触发该视图的布局更改事件,OnLayoutChangeListener可以捕捉到该事件:
将哑视图添加到布局末尾的示例:
侦听事件:
hjqgdpho5#
多亏了https://stackoverflow.com/users/2402790/michael-allan,如果你不想覆盖所有的视图,这是一个很好很简单的方法。随着API的发展,我建议用复制粘贴代替:
jk9hmnmh6#
参见文档。
在布局此视图时执行给定的操作。如果视图已布局且未请求布局,则将立即执行该操作,否则将在下一次布局视图后执行该操作。
该操作将仅在下一个布局上调用一次,然后删除。
l7mqbcuq7#
Kotlin版本基于@Michael Allan答案检测布局大小变化