Android在OnCreate中获取控件的宽度和高度的实现代码


在Android的`onCreate`方法中直接获取控件的宽度和高度可能会得到0,因为此时控件可能还没有被完全绘制和测量。不过,你可以通过几种方法间接地在`onCreate`之后获取控件的尺寸。

一种常用的方法是使用`ViewTreeObserver`来监听控件的绘制完成事件。以下是一个示例代码,展示了如何在Activity的`onCreate`方法中设置监听器,以便在控件被绘制完成后获取其宽度和高度:


public class MyActivity extends AppCompatActivity {

    private View myView; // 假设这是你要获取尺寸的控件

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        myView = findViewById(R.id.my_view); // 替换为你的控件ID

        // 使用ViewTreeObserver监听控件的绘制完成事件
        ViewTreeObserver vto = myView.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                // 控件的尺寸已经确定,现在可以安全地获取它们
                int width = myView.getWidth();
                int height = myView.getHeight();

                // 在这里使用width和height做你需要的事情
                // 注意:为了避免内存泄漏,最好在适当的时候移除这个监听器

                // 移除监听器
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                    myView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                } else {
                    // 对于Android 3.0之前的版本
                    myView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                }
            }
        });
    }
}

注意,在Android API 16(Jelly Bean)及以后的版本中,你应该使用`removeOnGlobalLayoutListener`来移除监听器,以避免潜在的内存泄漏。对于更早的API版本,你应该使用`removeGlobalOnLayoutListener`。

此外,请确保你的`my_view`在布局文件中已经被正确定义和引用。