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