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

來源:互聯網
上載者:User

標籤:

原因:這是一個很有趣的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():15702-12 18:15:49.774: E/Windows(5761): mContainer.getLayoutParams().height:28402-12 18:15:49.774: E/Windows(5761): mContainer.getHeight():15702-12 18:15:49.774: E/Windows(5761): mContainer.getLayoutParams().height:28402-12 18:15:49.774: E/Windows(5761): mContainer.getHeight():15702-12 18:15:49.774: E/Windows(5761): mContainer.getLayoutParams().height:28402-12 18:15:49.884: E/Windows(5761): mContainer.getHeight():24702-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重新整理完畢的時候肯定是這個數值。



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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.