Android開發 獲取View的尺寸的2個方法

前言

  總所周知,在activity啓動的onCreate或者其餘生命週期裏去獲取View的尺寸是錯誤的,由於頗有可能View並無初始化測量繪製完成.你這個時候獲取的寬或的高不出意外就是0.因此,咱們須要等待View的繪製完成後再來測量java

第一種方法,將測量添加到View列隊裏

mTextView.post(new Runnable() {
            @Override
            public void run() {
                int w = mTextView.getWidth();
                int h = mTextView.getHeight();
                
            }
        });

這個方式在TextView初始化所有完成後會執行這個消息列隊裏的邏輯ide

第二種方法,監聽View的測繪完成

mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(
    new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {                                                        
            mHeaderViewHeight = mHeaderView.getHeight();
            mHeaderView.getViewTreeObserver()
                    .removeGlobalOnLayoutListener(this);
        }
});

可是須要注意的是OnGlobalLayoutListener可能會被屢次觸發,所以在獲得了高度以後,要將OnGlobalLayoutListener註銷掉。另外mHeaderViewHeight和mHeaderView都須要寫在當前java文件類(好比Activity)的成員變量中。post

或者:this

public class TestActivity extends AppCompatActivity implements ViewTreeObserver.OnGlobalLayoutListener {
    private TextView tips;
    private ImageView mTestImage;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        tips = findViewById(R.id.tips);
        tips.getViewTreeObserver().addOnGlobalLayoutListener(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

    }

    @Override
    public void onGlobalLayout() {
        mTestImage.getViewTreeObserver().removeGlobalOnLayoutListener(this);

    }
} 
相關文章
相關標籤/搜索