Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android不能亂用的View.getHeight()(尤其是UI線程裡)

Android不能亂用的View.getHeight()(尤其是UI線程裡)

編輯:關於Android編程

原因:

這是一個很有趣的BUG View.getHeight(),得到的高度居然和我們想的不一樣,這個是從XListView的一個BUG說起,剛開始以為是Scroller沒有執行,經過一個小時的調試,發現原因是在這裡,View.getHeight(),返回的高度和真實的高度不一樣。

解決方案:

原來的代碼
public int getVisiableHeight() {
		return mContainer.getHeight();
	}
FIXED後的代碼:
public int getVisiableHeight() {
		return mContainer.getLayoutParams().height;
	}

為什麼呢? 讓我們看下日志
02-12 18:15:49.774: E/Windows(5761): mContainer.getHeight():157
02-12 18:15:49.774: E/Windows(5761): mContainer.getLayoutParams().height:284
02-12 18:15:49.774: E/Windows(5761): mContainer.getHeight():157
02-12 18:15:49.774: E/Windows(5761): mContainer.getLayoutParams().height:284
02-12 18:15:49.774: E/Windows(5761): mContainer.getHeight():157
02-12 18:15:49.774: E/Windows(5761): mContainer.getLayoutParams().height:284
02-12 18:15:49.884: E/Windows(5761): mContainer.getHeight():247
02-12 18:15:49.884: E/Windows(5761): mContainer.getLayoutParams().height:240

可以看出,兩個差距很大,為什麼呢? 主要是因為這個是因為計算的問題。mContainer.getLayoutParams().height 是自己相對於父控件設置的固定值。而mContainer.getHeight()源碼是這樣寫的
  public final int getHeight() {
        return mBottom - mTop;
    }
底部減去頂部,確實可以計算出來,但是這個過程不可靠,原因就在於多線程問題了,當我們處理onTouchEvent的時候UI線程還沒有刷新,UI線程和onTouchEvent是同一個線程,不信自己阻塞下試試就知道了,這時候我們得到的View.getHeight()肯定是個錯誤的數據,而 getLayoutParams().height是一個固定的數值,所以當View刷新完畢的時候肯定是這個數值。



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved