Предварительная загрузка фрагментов при запуске приложения

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

  private void initFragments() {
    FragmentManager fManager = getFragmentManager();
    FragmentTransaction fTransaction = fManager.beginTransaction();
    for (int i = 0; i < MAIN_FRAGMENTS; i++) {
        fTransaction.add(R.id.frame_container, fragmentArray[i], fragmentTags[i]);
    }
    fTransaction.commit();
    fManager.executePendingTransactions();
}
private void hideFragments(){
    FragmentManager fManager = getFragmentManager();
    FragmentTransaction fTransaction = fManager.beginTransaction();
    for (int i = 0; i < MAIN_FRAGMENTS; i++) {
        fTransaction.hide(fManager.findFragmentByTag(fragmentTags[i]));
    }
    fTransaction.commit();
    fManager.executePendingTransactions();
}

Мой способ обойти это состоял в том, чтобы просто создать все фрагменты, а затем скрыть их, вызвав

initFragments()
hideFragments()

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


person Robert Sun    schedule 14.05.2015    source источник
comment
В соответствии с вашей реализацией я считаю, что для извлечения данных из веб-службы не нужны никакие пользовательские данные, вы извлекаете их один раз и отображаете. Вы можете получить все данные, которые вам нужны, во всплывающей активности или где-то после этого, сохранить их в классе-контейнере, а затем отобразить все плавно. Вместо того, чтобы делать частые переходы фрагментов.   -  person theJango    schedule 14.05.2015


Ответы (1)


Вы получаете какие-либо ошибки?

Я подозреваю, что некоторые устройства/версии могут не поддерживать метод findFragmentByTag() или метод hide(). Попробуйте изучить это.

Что касается вашей проблемы с перекрытием на планшетах, попробуйте следующее: https://stackoverflow.com/a/11086185/2929693

person D. Visser    schedule 14.05.2015
comment
Ошибок вроде бы не возникает. И более того, когда я запускаю его с помощью эмулятора телефона, перекрывающиеся фрагменты возникают только при первом запуске эмулятора. После закрытия приложения и его повторного открытия перекрывающиеся фрагменты никогда не возникают - person Robert Sun; 14.05.2015
comment
Вероятно, это потому, что вы вызываете это из метода onCreate(), не так ли? Попробуйте вызвать initFragments() и/или hideFragments() из метода onResume(). Если вам интересно узнать о различных состояниях действия, обратитесь к официальная документация. - person D. Visser; 14.05.2015
comment
Я действительно вызывал его из onCreate() раньше, но я только что попытался вызвать их обоих из onResume(), и это все еще дает мне тот же результат. На некоторых устройствах оно начинается с перекрывающихся фрагментов, но после перезапуска приложение никогда больше не появляется. - person Robert Sun; 14.05.2015
comment
Этот способ сделать то же самое кажется немного хакерским, но помогает. Вы можете попробовать это, пока кто-нибудь не придет с лучшим ответом. - person D. Visser; 14.05.2015
comment
Кстати, вы уверены, что повторяете цикл for на всех устройствах? И все ли устройства, которые вы тестировали, имеют уровень API 11 или выше? Звучит глупо, но такие простые вещи иногда вызывают сильнейшую головную боль. - person D. Visser; 14.05.2015
comment
Кажется, мне удалось исправить перекрывающиеся фрагменты при запуске, изменив метод initFragments, проверив, может ли диспетчер фрагментов найти фрагмент по определенному тегу, и, если фрагмент был нулевым, добавить фрагмент. Я полагаю, что при запуске он по какой-то причине дважды вызывал initFragments и hideFragments? Не уверен, почему - person Robert Sun; 14.05.2015