2012-11-16 20 views
0

我曾嘗試使用getTop()getLeft()方法得到的textView的位置,但他們總是回到我0。我把這種方法從的onCreate()機器人不能得到視圖位置座標

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    TextView textView = (TextView) findViewById(R.id.hello); 

    int top = textView.getLeft(); 
    int left = textView.getLeft(); 
    int height = textView.getHeight(); 

    Log.i("top", "top = " + top); 
    Log.i("left", "left = " + left); 
    Log.i("height", "height = " + height); 
+0

您得到0的原因是因爲onCreate在視圖實際測量顯示之前調用。 –

回答

2

我找到答案。只需使用getViewTreeObserver().addOnGlobalLayoutListener並在此方法內部調用getLeft,getTop等。

+0

這是執行此操作的正確方法。 –

1

TextView的ISN那時候還沒有看到。您需要在您活動的生命週期中稍後調用(請參閱下面的文檔)。

引述lifecycle documentation

一旦的onCreate()執行完畢後,系統調用在onStart() 和快速連續的onResume()方法。您的活動永遠不會 駐留在已創建或已啓動狀態。技術上,活動 變得對用戶時可見在onStart()被調用,但的onResume() 迅速遵循和活動仍然在續狀態,直到發生 東西來改變

Some image

1

佈局傳遞完成後,佈局偵聽器將會觸發。它不受限於特定的活動生命週期,因此您必須添加觀察者到佈局傳遞。

view.getViewTreeObserver().addOnGlobalLayoutListener(
      new ViewTreeObserver.OnGlobalLayoutListener() 
      { 
       @Override 
       public void onGlobalLayout() 
       { 
        // Now you may get the left/top/etc. 
        getCoordsFromView(view); 
        // Optionally remove the listener so future layouts don't change the value 
        view.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
       } 
      });