Ответ 1
Попробуйте запустить fragmentManager.executePendingTransactions()
после совершения транзакции, но прежде чем найти тег и посмотреть, работает ли это для вас.
Я создаю приложение для планшета. В этом приложении есть одно действие с двумя фрагментами. Первый фрагмент - это "известный" фрагмент списка, который показывает простой список макетов элементов из запроса базы данных, второй фрагмент показывает подробности о выбранной записи (из фрагмента списка). Мысль со вторым фрагментом заключается в том, что его тип зависит от записей, отображаемых в списке. Например, если записи являются клиентами, тогда отображаются выбранные данные клиента, если они являются элементами инвентаря, отображаются данные выбранного элемента и т.д. Чтобы связаться с фрагментом деталей, я создал интерфейс, который реализует каждый фрагмент фрагмента. Фрагмент списка "фиксирован" в активности из макета 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 всегда имеет значение null. Это происходит из-за того, что фрагментTransaction.commit() не запускается немедленно, но он происходит в основном потоке в следующий раз, когда поток готов (как указано в документации по android).
Если я создам фрагмент детали в onStart() и создаю экземпляр фрагмента списка в onCreate, все работает нормально.
Итак, вопрос: как я могу быть уверенным, что фрагментTransaction.commit() совершил транзакцию, чтобы я мог выполнить некоторую работу с добавленным фрагментом? Кроме того, есть ли способ подождать, пока произойдет фиксация, а затем продолжить с остальной частью кода?
Спасибо за ваше время и усилия,
Христоса
Попробуйте запустить fragmentManager.executePendingTransactions()
после совершения транзакции, но прежде чем найти тег и посмотреть, работает ли это для вас.
В Android API 24 FragmentTransaction
имеется синхронный метод .commitNow()
.
Это теперь в ссылке: https://developer.android.com/reference/android/app/FragmentTransaction.html#commitNow()
Наоборот, .commit()
работает асинхронно. Он просто планирует фиксацию транзакции.
".... , поэтому я могу выполнить некоторую работу с добавленным фрагментом. Кроме того, есть какой-либо способ подождать, пока произойдет фиксация, и , а затем продолжить с остальной частью кода?"
Все зависит от того, какую работу вы хотите сделать. Из вашего вопроса я вижу, что большая часть вашего рабочего кода должна быть в коде фрагмента в любом случае, например, когда выбран элемент инвентаря.
При обратном вызове, когда выбран элемент списка выбора (чтобы изменить фрагмент деталей), вы сможете в достаточной степени получить фрагмент деталей.
Кроме того, у вас уже есть фрагмент из возврата FragmentsPool.getHelperFileFragment(501),
, поэтому я не понимаю, почему вам нужно получить фрагмент через его тег.
Мне интересно узнать, какую работу вам нужно сделать в onCreate
с фрагментом добавленных деталей.