2013-06-21 4 views
16

Я читал, что если нам нужно немедленно создать фрагмент, мы должны вызвать метод executePendingTransactions() на FragmentManager. Ну, вот что я пытаюсь сделать. Как это:onCreateView() в Fragment не вызывается сразу, даже после FragmentManager.executePendingTransactions()

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_game); 

    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

    fragmentTransaction.add(R.layout.fragmentContainer, new MyFragment); 
    fragmentTransaction.commit(); 
    fragmentManager.executePendingTransactions(); 

    foo(); // It is called before MyFragment's onCreateView() 
} 

Я хотел бы знать, почему foo() метод вызывается ДО MyFragment «s onCreateView(). Как вы видите, я звоню executePendingTransactions() в UI Thread, как и должно быть. Я вообще не возился с нитями.

+0

Вы можете прикрепить булев для выполнения отложенного txns как этот 'логических Валу = fragmentManager.executePendingTransactions();' и видеть то, что он дает один раз Foo вызывается при отладке. – Slartibartfast

+0

Привет, есть ли новости по этому вопросу? Я столкнулся с такой же проблемой и не могу найти решение. Если вы решили, можете ли вы поделиться решением, пожалуйста? – Haspemulator

+0

@ Haspemulator К сожалению, нет - я, наконец, решил использовать совершенно другой подход. –

ответ

16

Я столкнулся с той же проблемой, и я обнаружил, что если бы я запустил один и тот же код фрагмента кода внутри метода onStart, выполнение работало, как ожидалось. Я не знаю достаточно о жизненном цикле просмотра Android, чтобы узнать, почему это так.

public void onStart() { 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

    fragmentTransaction.add(R.layout.fragmentContainer, new MyFragment); 
    fragmentTransaction.commit(); 
    fragmentManager.executePendingTransactions(); 

    foo(); // Should now work correctly 
} 
+0

Спасибо! Я хочу добавить только одну полезную функцию - используйте onPostCreate() вместо onStart(), чтобы избежать создания фрагментов каждый раз, когда вызывается onStart(). Ура! –