Android FragmentTransaction commit Когда? - PullRequest
45 голосов
/ 30 августа 2011

Я создаю приложение для планшета. В этом приложении есть одно действие с двумя фрагментами. Первый фрагмент - это «известный» фрагмент списка, который показывает простой список элементов из запроса базы данных, второй фрагмент показывает подробности о выбранной записи (из фрагмента списка). Смысл второго фрагмента в том, что его тип зависит от записей, отображаемых в списке. Например, если записи являются клиентами, то отображаются сведения о выбранном клиенте, если они являются товарно-материальными запасами, отображаются данные выбранного товара и т. Д. Для связи с фрагментом подробностей я создал интерфейс, который реализует каждый класс фрагмента подробностей. Фрагмент списка «фиксирован» в активности из макета xml. Фрагмент детали, однако, создается во время создания операции следующим образом:

super.onCreate(savedInstanceState);
setContentView(R.layout.act_hlpfiles_host);

...

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.laydetailsfragment, FragmentsPool.getHelperFileFragment(501), "recordDetails");
fragmentTransaction.commit();

myDetailsFragment = getFragmentManager().findFragmentByTag("recordDetails");

...

myListFragment = (frg_hlpfiles_lstrecords) getFragmentManager().findFragmentById(R.id.frg_lstrecords);

....
}

Проблема с этим кодом в том, что myDetailsFragment всегда равен нулю. Это связано с тем, что фрагментTransaction.commit () запускается не сразу, а в основном потоке в следующий раз, когда этот поток готов (как указано в документации Android).

Если я создаю фрагмент детализации в onStart () и создаю экземпляр фрагмента списка в onCreate, все работает нормально.

Таким образом, вопрос заключается в следующем: как я могу быть уверен, что FragmentTransaction.commit () зафиксировал транзакцию, чтобы я мог выполнить некоторую работу с добавленным фрагментом? Кроме того, есть ли способ подождать, пока произойдет фиксация, а затем продолжить работу с остальным кодом?

Ответы [ 3 ]

104 голосов
/ 31 августа 2011

Попробуйте выполнить fragmentManager.executePendingTransactions() после совершения транзакции, но перед поиском по тегу и посмотрите, подходит ли это вам.

7 голосов
/ 12 марта 2016

В Android API 24 FragmentTransaction есть синхронный метод .commitNow(). Сейчас в ссылке: https://developer.android.com/reference/android/app/FragmentTransaction.html#commitNow()

Наоборот, .commit() работает асинхронно. Он просто планирует фиксацию транзакции.

0 голосов
/ 31 августа 2011

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

Все зависит от того, какую работу вы хотите сделать.Из вашего вопроса я вижу, что большая часть вашего рабочего кода должна быть в любом случае в вашем фрагментном коде, например, когда выбран элемент инвентаря.

На обратном вызове, когда выбран элемент списка выбора (чтобы изменитьфрагмент подробностей) вы все равно сможете достаточно удобно достать фрагмент подробностей.

Более того, у вас уже есть фрагмент из возврата FragmentsPool.getHelperFileFragment(501),, поэтому я не понимаю, зачем вам нужно получатьфрагмент через его тег.

Мне интересно знать, какую работу вам нужно сделать в onCreate с добавленным вами фрагментом информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...