在onCreate()上获取ImageButton大小

时间:2013-07-22 22:39:44

标签: android android-layout

我有一个图像按钮并在运行时使用Bitmap对象动态生成图像(没有问题):

MyButton.setImageBitmap(AMethodReturningBitmap());

我想确定位图的大小。因此,在onCreate()活动之后的任何时间(如另一个按钮点击等),我可以写:

MyButton.setImageBitmap(AMethodReturningSizedBitmatp(MyButton.getWidth(), MyButton.getHeight()));

但是,如果我在onCreate()执行此操作,则会出现异常。我的“猜测”是在那个时候,因为图像没有创建,它不能有宽度和高度。例如,我可以写:

MyButton.setImageBitmap(AMethodReturningSizedBitmatp(16, 16));

但是我想要它而不点击按钮等。是否有一个事件我可以使用并且安全,访问ImageButton的大小不会抛出异常?

2 个答案:

答案 0 :(得分:1)

来自onGlobalLayout()'s文档:

  

当全局布局状态或者调用时要调用的回调方法   视图树中视图的可见性发生变化

myButton.getViewTreeObserver().addOnGlobalLayoutListener(
                        new ViewTreeObserver.OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {

        // Ensure you call it only once :       
        myButton.getViewTreeObserver().removeOnGlobalLayoutListener(this);

        // Here you can get the dimensions
        myButton.setImageBitmap(AMethodReturningSizedBitmatp(
                        myButton.getWidth(), myButton.getHeight()));        

    }

});

答案 1 :(得分:0)

@ vikram建议的替代方法是将逻辑包装在Runnable中并将其发布到MyButton父级的内部消息队列中。这看起来像这样:

MyButtonParent.post(new Runnable() {
    @Override public void run() {
        MyButton.setImageBitmap(AMethodReturningSizedBitmatp(MyButton.getWidth(), MyButton.getHeight()));
    }
});

这种方式setImageBitmap()不会被调用,直到父队列中的其他消息(包括其所有子节点的测量和布局步骤)已被处理。因此,当您Runnable运行时,MyButton将具有有效的宽度和高度。