0

與含有按鈕的ID的片段=按鈕 創建應用在的Android CommitNow不調用onCreateView從的onCreate

@Override 
    protected void onStart() { 
     super.onStart(); 
     getSupportFragmentManager() 
       .beginTransaction() 
       .add(R.id.activity_main, new Testfrag()) 
       .commitNow(); 
     View b = findViewById(R.id.button); 

    } 

b爲返回按鈕和片段onCreateView該方法結束前被調用。 但在

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
FragmentManager fm= getSupportFragmentManager(); 
     fm.beginTransaction() 
      .add(R.id.activity_main, new Testfrag()) 
     .commitNow(); 
    View b = findViewById(R.id.button); 
} 

b爲null並且片段onCreateView不叫,直到該方法結束後。 這可能是一個「功能」,但在文檔中沒有任何關於它的內容。

爲什麼現在承諾行爲不同onCreate - 不叫onCreateView直到後來何onCreateView同步調用在onStart(或任何其他事件處理程序)?

回答

0

我真的很驚訝第一個作品。

如果我必須下注,那麼FragmentManager不會在活動當前生命週期之外調用Fragment生命週期回調。從onCreate()它將在片段上調用onAttach(),然後onCreate()。在onCreateonStart之間的某個點處,FragmentManager將通過在目前爲止已經提交的每個片段上調用onCreateView()來完成佈局過程。然後當Activity開始時,它會在每個片段上調用onStart()

如果您要在稍後的回調中提交片段,例如onResume()。片段管理器將需要將片段一直設置到某一點,所以它將一次全部下降到生命週期onAttach(),onCreate(),onCreateView(),onViewCreated()onStart()和最終onResume()。現在,片段將被抓到活動的其餘部分。

一般來說,活動通常沒有理由直接訪問內部視圖元素。碎片處理視圖事件。如有必要,將事件傳遞迴活動。這使您可以在不修改活動的情況下更改片段的佈局。它還允許您在不同的活動中重新使用片段。

+0

這是一個有趣的想法和活動和片段生命週期如何配合在一起的文檔並不清楚。但是,如果您使用標籤包含片段,則FragmentManager會在Activitys OnCreate中調用onCreateView。 我會看看我是否可以詳細瞭解兩個生命週期如何同步。 –

+0

@MikeJames我發現最好不要將兩個生命週期連接在一起。例如,使用ViewPager時,片段的生命週期變得非常複雜。把它們想象成兩個獨立的實體。 – DeeV

+0

我可以看到,忽略活動和片段生命週期之間的任何同步是一個簡化,當你正在考慮設計一個片段時,但在這種情況下,它已被認爲是理解正在發生的事情的根本。假設是活動不會「推動」片段的狀態,而不是當時的狀態。仍在試圖弄清楚如何確定這確實是怎麼回事。 –

相關問題