1.屏幕高度是由三部分组成:actionBar,titleBar,content
Rect rect = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
获取actionBar的高度 :rect.top();
获取content的高度:rect.height();
getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View view, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
//当layout发生变化时需要处理的内容
}
});
一般情况下监听整个window布局发生变化可能会产生因为layout一直变化导致回调次数变多,尤其是在scrollview的addOnLayoutChangeListener监听,会因为变化导致多次调用。故在监听中对一些固定的view进行监听,从而避免多次回调问题的产生。
<pre>
int actionBarId = Resources.getSystem().getIdentifier("split_action_bar","id","android");
View decorView = findViewById(actionBarId);
decorView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View view, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
LinearLayout.LayoutParams params=(LinearLayout.LayoutParams)mContentScroller.getLayoutParams();
if(oldBottom !=0 && bottom !=0 && (bottom - oldBottom)>0){
params.bottomMargin = 0;
} else {
params.bottomMargin = (int)getResources().getDimension(R.dimen.novirtual_content_height);
}
mContentScroller.setLayoutParams(params);
}
});</pre>
//上述代码中的bottom以及oldBottom,都是针对decorView位置的前后变化而言,即监听组件的前后bottom值。
2.此外其他对布局变化的方式包含有:
onSizeChanged(Activity需要是AdjustResize的)
onLayout(不用监听onMeasure,回调的位置太多了)
addOnLayoutChangeListener监听layout的回调事件
getViewTreeObserver().addOnGlobalLayoutListener监听全局的layout事件
可参考链接:http://blog.csdn.net/pouloghost/article/details/50971381