0

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

MyButton.setImageBitmap(AMethodReturningBitmap());

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

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

但是,如果我这样做,onCreate()我会得到一个例外。我的“猜测”是当时由于没有创建图像,它不能有宽度和高度。例如我可以写:

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

但是我想在不单击按钮等的情况下进行操作。是否有一个事件可以使用并且可以确保访问 ImageButton 的大小不会引发异常?

4

2 回答 2

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()));        

    }

});
于 2013-07-22T22:44:57.150 回答
0

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

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

在父队列中的其他消息(包括所有子队列的测量和布局步骤)被处理之前,这种方式setImageBitmap()不会被调用。结果,在您Runnable运行时,MyButton将具有有效的宽度和高度。

于 2013-07-22T22:56:30.793 回答