2013-11-27 61 views
1

我在線性佈局中添加了10個textview。我得到所有textview的所有座標。我使用下面的代碼。在android中運行時獲取textview數組的座標

public class MainActivity extends Activity 
{ 
    TextView t[] = new TextView[10];; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
{ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     LinearLayout linear = (LinearLayout) findViewById(R.id.linear); 
     for(int i=0;i<10;i++) 
     { 
      t[i] = new TextView(this); 
      t[i].setTag(i); 
      String s = "Hello : "+i; 
      t[i].setText(s); 
      linear.addView(t[i]); 
     } 
     for(int i=0;i<10;i++) 
     { 
      float x0 = t[i].getX(); 
      float y0 = t[i].getY(); 
      float y1 = t[i].getWidth(); 
      float x1 = x0 + t[i].getHeight(); 


      Log.d(""+i, "x0 : "+x0 +" y0 : "+y0); 
      Log.d(""+i, "x0 : "+x0 +" y1 : "+y1); 
      Log.d(""+i, "x1 : "+x1 +" y0 : "+y0); 
      Log.d(""+i, "x1 : "+x1 +" y1 : "+y1); 
     } 
} 

所有的textview都顯示在屏幕上。但我總是得到0。這段代碼有什麼問題?

回答

1

問題是LinearLayout還沒有通過它的度量和佈局傳遞。它包含這些對象,但它們現在「沒有」。

後可運行到的LinearLayout和做同樣的事情:

linear.post(new Runnable()) { 
    // The view is now visible. Retrieve the objects and check. 
} 
1

您可能想要在LinearLayout進行更改以執行子視圖的度量和佈局後獲取文本視圖的座標。

觀察onLayout事件並檢查那裏的座標。

0

setContentView後,需要一段時間之前的觀點實際上是在屏幕上繪製。您immedeately,因此這樣做,觀點現在還沒有......等待LinearLayout要繪製像這樣:

/** Replace your 2nd loop, with the code below*/ 
linear.addOnLayoutChangeListener(new OnLayoutChangeListener() { 

    @Override 
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 

     for (int i = 0; i < 10; i++) { 
      float x0 = t[i].getX(); 
      float y0 = t[i].getY(); 
      float y1 = t[i].getWidth(); 
      float x1 = x0 + t[i].getHeight(); 

      Log.d("" + i, "x0 : " + x0 + " y0 : " + y0); 
      Log.d("" + i, "x0 : " + x0 + " y1 : " + y1); 
      Log.d("" + i, "x1 : " + x1 + " y0 : " + y0); 
      Log.d("" + i, "x1 : " + x1 + " y1 : " + y1); 
     } 

    } 
}); 
0

當你需要「刷新」你的佈局,它調用無效。只是在UI線程中調用它。如果你在另一個線程(比如一個定時器)中調用它,那麼調用postInvalidate。

您需要等待佈局進行測量。在for循環之後5秒後寫一個runnable。

new Timer().schedule(new TimerTask(){ 
    public void run() { 
     //do something here 
    } 
}, 2000); //delay of 2 seconds 

,或者使用一個處理程序: -

您可以使用一個處理程序,在某種程度上就像一個定時器

Handler delay = new Handler(); 
delay.postDelayed(mUpdateTimeTask, 2000);//time in milliseconds 

並呼籲這一點:

private Runnable mUpdateTimeTask = new Runnable() 
{ public void run() 
    { // Todo 

     // This line is necessary for the next call 
     delay.postDelayed(this, 100); 
    } 
}