在Android中添加布局后获取元素位置
问题描述:
我试图在将它添加到相对布局后获取ImageView的位置。在Android中添加布局后获取元素位置
我通过点击一个按钮在相对布局内随机添加ImageViews。到目前为止,这工作非常好。但为什么getLeft,getRight,getTop,getBottom返回0?事情是,这些值都可以在下一个按钮点击。因此,当ImageView 1的创建过程中所有内容都为0时,如果再次点击该按钮,它就会显示信息。
所以要清楚:
Buttonclick -1 - >的ImageView-1中加入(输出0上getLeft,上,右,下)
Buttonclick -2 - >的ImageView -2- (ImageView-1输出坐标,但ImageView-2输出为0)
我确定这与ImageView的绘制有关。当我迭代孩子并询问实际位置时,它肯定没有准备好在视图上绘制。
这是到目前为止我的代码:
final ConstraintLayout cl = (ConstraintLayout) findViewById(R.id.constraintLayout);
final ScrollView sc=(ScrollView) findViewById(R.id.scrollView);
final Button btnButton = (Button) findViewById(R.id.buttontest);
final LinearLayout ll = (LinearLayout) findViewById(R.id.linearLayout);
final RelativeLayout rl = (RelativeLayout) findViewById(R.id.rLayout);
btnButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ImageView im= new ImageView(UserAreaActivity.this);
im.setImageResource(R.mipmap.ic_launcher);
im.setScaleType(ImageView.ScaleType.FIT_XY);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(150, 150);
Random r = new Random();
Random r2 = new Random();
int x = r.nextInt(rl.getWidth());
int y = r2.nextInt(rl.getHeight());
if(x+(layoutParams.width) >= rl.getWidth()){
x=x-layoutParams.width;
}
if(y+(layoutParams.height) >= rl.getHeight()){
y=y-layoutParams.height;
}
layoutParams.leftMargin=x;
layoutParams.topMargin=y;
im.setLayoutParams(layoutParams);
TextView tv = new TextView(UserAreaActivity.this);
tv.setText("my text");
rl.addView(im);
ll.addView(tv);
System.out.println("ID "+im.getId());
System.out.println("Left "+im.getLeft());
System.out.println("Right "+im.getRight());
System.out.println("Top "+im.getTop());
System.out.println("Bottom "+im.getBottom());
for (int i = 0; i < rl.getChildCount(); i++) {
View subView = rl.getChildAt(i);
if (subView instanceof ImageView) {
ImageView imageView = (ImageView) subView;
System.out.println("ID "+i);
System.out.println("Left "+imageView.getLeft());
System.out.println("Right "+imageView.getRight());
System.out.println("Top "+imageView.getTop());
System.out.println("Bottom "+imageView.getBottom());
}
}
}
});
答
当你调用rl.addView(im);
你踢了一个过程,最终将涉及“布局通”为您RelativeLayout
和你ImageView
。只有在此布局通过完成后,您才能获得有效的坐标,为您的ImageView
。
不幸的是,没有一行代码“给我布局过后的坐标”。所有最佳选择都是异步的(即,您注册了一些代码后,即可运行ImageView
)。我建议ViewTreeObserver.OnGlobalLayoutListener
。
事情是这样的:
im.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
System.out.println("ID "+im.getId());
System.out.println("Left "+im.getLeft());
System.out.println("Right "+im.getRight());
System.out.println("Top "+im.getTop());
System.out.println("Bottom "+im.getBottom());
im.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
非常感谢您!这解决了我的问题。顺便说一句。我不得不注意我正在处理哪些API,因为'removeOnGlobalLayoutListener'未包含在API Lvl 15中 – Sully