1. Activity
覆寫 onWindowFocusChanged(boolean hasFocus)方法。
@Override public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
/* 獲取在當前窗口內的絕對坐標 */
int[] location1 = new int[2] ;
view.getLocationInWindow(location1);
/*獲取在整個屏幕內的絕對坐標*/
int[] location2 = new int[2] ;
view.getLocationOnScreen(location2);
doSomething();
}
}
2. Fragment
在 onCreateView()中通過ViewTreeObserver為View注冊addOnGlobalLayoutListener()接口回調。
private View view;
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.xxx, container, false);
ViewTreeObserver vto = view.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override public void onGlobalLayout() {
/* 獲取子控件信息 */
doGetInfo();
/* 獲取子控件信息后,注銷回調用接口 */
view.getViewTreeObserver().removeOnGlobalLayoutListener(this); } });
doSomething();
return view;
}
注:因為當在一個視圖樹中全局布局發生改變或者視圖樹中的某個視圖的可視狀態發生改變時,OnGlobalLayoutListener就會被觸發,所以此接口的回調函數可能會被多次調用,因此在得到了高度之后,要將OnGlobalLayoutListener注銷掉。