我有一个图像按钮并在运行时使用Bitmap
对象动态生成图像(没有问题):
MyButton.setImageBitmap(AMethodReturningBitmap());
我想确定位图的大小。因此,在onCreate()
活动之后的任何时间(如另一个按钮点击等),我可以写:
MyButton.setImageBitmap(AMethodReturningSizedBitmatp(MyButton.getWidth(), MyButton.getHeight()));
但是,如果我在onCreate()
执行此操作,则会出现异常。我的“猜测”是在那个时候,因为图像没有创建,它不能有宽度和高度。例如,我可以写:
MyButton.setImageBitmap(AMethodReturningSizedBitmatp(16, 16));
但是我想要它而不点击按钮等。是否有一个事件我可以使用并且安全,访问ImageButton的大小不会抛出异常?
答案 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
将具有有效的宽度和高度。