1. 程式人生 > >android 8.0 自定義控制元件onmesure獲取寬度為0

android 8.0 自定義控制元件onmesure獲取寬度為0

最近專案需要適配8.0版本,自定義控制元件出現了下面的問題

第一次顯示此彈窗字型出現了偏移,找到原因是textpaint在繪製文字的時候

canvas.drawText(itemText,  x + (controlWidth / 2) -textRect.width()/2, height,
        textPaint);

其中controlwidth寬度也就是控制元件寬度為0.

發現在控制元件onmesure時  getwidth()方法獲取到寬度為0. 一番排查發現,自定義控制元件在onmesure時,父控制元件並沒有繪製完畢,導致

自定義控制元件寬度為0(不知道是不是8.0有什麼改動),然後做了如下修改

    llCover.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
         @Override
         public void onGlobalLayout() {
            llCover.getViewTreeObserver()
                  .removeGlobalOnLayoutListener(this);
         pick_province.requestLayout();
         pick_city.requestLayout();
         pick_district.requestLayout();
         }

監聽父控制元件繪製情況,繪製完畢之後重新再繪製一邊自定義控制元件,這下可以獲取到寬度了。完美解決問題