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) {
//當(dāng)layout發(fā)生變化時(shí)需要處理的內(nèi)容
}
});
?一般情況下監(jiān)聽整個(gè)window布局發(fā)生變化可能會(huì)產(chǎn)生因?yàn)閘ayout一直變化導(dǎo)致回調(diào)次數(shù)變多,尤其是在scrollview的addOnLayoutChangeListener監(jiān)聽,會(huì)因?yàn)樽兓瘜?dǎo)致多次調(diào)用。故在監(jiān)聽中對一些固定的view進(jìn)行監(jiān)聽,從而避免多次回調(diào)問題的產(chǎn)生。
<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位置的前后變化而言,即監(jiān)聽組件的前后bottom值。
2.此外其他對布局變化的方式包含有:
? onSizeChanged(Activity需要是AdjustResize的)
? onLayout(不用監(jiān)聽onMeasure,回調(diào)的位置太多了)
? addOnLayoutChangeListener監(jiān)聽layout的回調(diào)事件
? getViewTreeObserver().addOnGlobalLayoutListener監(jiān)聽全局的layout事件
可參考鏈接:http://blog.csdn.net/pouloghost/article/details/50971381