在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); 
     } 
    }); 
+0

非常感谢您!这解决了我的问题。顺便说一句。我不得不注意我正在处理哪些API,因为'removeOnGlobalLayoutListener'未包含在API Lvl 15中 – Sully