2017-05-30 502 views
2

任何人都可以解釋爲什麼isAttachedToWindow()false而不是true?我似乎有附件問題。isAttachedToWindow()returns false

據我瞭解,setContentView(rl)應該將RelativeLayout附加到窗口。我錯過了什麼?

public class TestActivity extends Activity { 
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      final RelativeLayout rl = new RelativeLayout(this); 
      setContentView(rl); 
      boolean isAttached = rl.isAttachedToWindow(); 
    } 
} 

回答

1

當你執行的是視圖相關的動作,這種變化實際上並不會立即執行,而是將在主線程的MessageQueue,後來這些消息會被Looper的下一個循環處理髮布事件。

讓我們來說一個具體的例子。想象一下你有一個TextViewwrap_content/wrap_content佈局屬性。

 


    TextView textView = ...; 
    textView.setText("some fancy text"); 

    // Will print `0 0`, because this message hasn't yet beet "parsed" by `Looper` 
    // Changes will take effect on the next frame 
    Log.i("tag", textView.getWidth() + " " + textView.getHeight()); 

    // Will print `some fancy text`, because this is just a plain Java object 
    Log.i("tag", textView.getText()); 

 

在你的情況,你不得不等待足夠你會看到它最終被連接。您可以通過View#addOnAttachStateChangeListener() API獲知有關附加狀態更改的通知。

1

猜測是你不能依靠視圖onCreate()實際連接到窗口。你最好做你isAttached()檢查後onStart()

根據該文檔爲onStart()

無效onStart()

onCreate(Bundle)後調用 - 或onRestart() 活動時已被停止後,但現在再次向用戶顯示 。接下來是onResume()

派生類必須調用 來實現超類的這種方法。如果 他們沒有,則會拋出異常。

所以,一旦開始被調用,活動就會顯示給用戶,這意味着假設您的視圖被附加到窗口是安全的。相反,onCreate()可能已被調用,但該活動可能尚未顯示給用戶 - 因此您的視圖可能未附加。

+1

它將被附加在視圖層次結構的遍歷上,比如佈局或繪製過程。 'onCreate()'還沒有發生。實際上,可以在不通過'onStart()'的情況下離開活動 - 例如,如果在到達那裏之前調用'finish()',那麼在這種情況下,附件永遠不會發生。 – ephemient