Страницы

Поиск по вопросам

пятница, 7 июня 2019 г.

Почему findFragmentById возвращает null?

Объясните пожалуйста, почему getSupportFragmentManager().findFragmentById(R.id.fragment_container) возвращает null если в классе SingleFragmentActivity он добавляется в FragmentManager?


public class MyFragment extends Fragment { }

public abstract class SingleFragmentActivity extends AppCompatActivity { FragmentManager fm= getSupportFragmentManager(); protected abstract Fragment createFragment(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment); Fragment fragment = fm.findFragmentById(R.id.fragment_container); if (fragment == null) { fragment = createFragment(); fm.beginTransaction() .add(R.id.fragment_container, fragment) .commit(); } } }

public class MyActivity extends SingleFragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Возвращает null Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container); } @Override protected Fragment createFragment() { return new MyFragment(); } }


Ответ

Вызов commit() не выполняет транзакцию немедленно, а ставит в очередь UI-потока. Поэтому следующий за ним вызов findFragmentById выполняется раньше, чем фрагмент будет добавлен. Вместо этого можно завершить транзакцию синхронным методом commitNow() - тогда всё выполнится по порядку.

Комментариев нет:

Отправить комментарий