2017-07-15 168 views
0

我試圖在將它添加到相對佈局後獲取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()); 

       } 
      } 

     } 

    }); 

回答

1

當你調用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