Моя проблема связана с деятельностью, содержащей три фрагмента поддержки. Один - это обычный программный фрагмент (назовем его домашним фрагментом). Один - это фрагмент портрета, добавляемый поверх исходного фрагмента при ориентации устройства, а второй - «без головы» для продолжения асинхронной задачи независимо от изменений конфигурации. Очень просто, я работал над этим прекрасным примером.
public class HeadlessCustomerDetailFetchFragment extends Fragment{
private RequestCustomerDetails mRequest;
private AsyncFetchCustomerDetails mAsyncFetchCustomerDetails;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
mRequest = (RequestCustomerDetails)getActivity();
}
public void startFetching(String scannedBarcode) {
if(mAsyncFetchCustomerDetails != null && mAsyncFetchCustomerDetails.getStatus() == AsyncTask.Status.RUNNING) return;
if(mAsyncFetchCustomerDetails == null || mAsyncFetchCustomerDetails.getStatus() == AsyncTask.Status.FINISHED)
mAsyncFetchCustomerDetails = new AsyncFetchCustomerDetails(getActivity(), mRequest, mPartner, scannedBarcode);
}
public void stopFetching() {
if(mAsyncFetchCustomerDetails != null && mAsyncFetchCustomerDetails.getStatus() != AsyncTask.Status.RUNNING) return;
mAsyncFetchCustomerDetails.cancel(true);
}
}
В моем действии onCreate () я создаю и при необходимости добавляю фрагмент без заголовка.
mHeadlessCustomerDetailFetchFragment = (HeadlessCustomerDetailFetchFragment)getSupportFragmentManager()
.findFragmentByTag(HeadlessCustomerDetailFetchFragment.class.getSimpleName());
if(mHeadlessCustomerDetailFetchFragment == null) {
mHeadlessCustomerDetailFetchFragment = HeadlessCustomerDetailFetchFragment.instantiate(this, HeadlessCustomerDetailFetchFragment.class.getName());
getSupportFragmentManager().beginTransaction()
.add(mHeadlessCustomerDetailFetchFragment, mHeadlessCustomerDetailFetchFragment.getClass().getSimpleName())
.commit();
getSupportFragmentManager().executePendingTransactions();
id = null;
}
Затем я запускаю асинхронную задачу (через мою функцию startFetching ()) после 6-секундной задержки (для тестирования), запущенной в onCreateView () фрагмента портрета, который добавляется при изменении ориентации на портретную. Изменение ориентации обнаруживается в onCreate () действия:
if (savedInstanceState == null) {
// Do some initial stuff for the home fragment
}
else {
getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
//Launch portrait fragment
FragmentLauncher.launchPortraitFragment(this);
}
Когда задача завершена, я возвращаюсь к действию и пытаюсь обновить пользовательский интерфейс активного фрагмента портрета, но диспетчер фрагментов не может его найти, findFragmentByTag () возвращает null.
Чтобы было ясно:
- Тег правильный
- Фрагмент обнаруживается, если я не ориентирую устройство, а вместо этого запускаю асинхронную задачу в другом месте, например, во время действия onResume ().
- Если я не скажу фрагменту без головы, чтобы он сохранил себя - таким образом, теряя возможность не воссоздавать его, фрагмент портрета также будет правильно найден.
- Отладка. Я вижу все 3 фрагмента в диспетчере если безголовый не настроен на сохранение самого себя. Если это так, я могу только увидеть фрагмент без головы.
Может быть, сохранение фрагмента агрессивно убивает другие фрагменты, которые не сохраняются, или что-то в этом роде?
setRetained
изменит способpopBackStackImmediate(name, flags)
работы? Я могу попробовать удалить или изменитьgetSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
- person Leo Landau   schedule 05.11.2015