2014-08-31 2 views
10

Я создаю навигационный ящик, как это предусмотрено документацией Google, однако у меня есть проблема, когда фрагмент не заменяется. http://developer.android.com/training/implementing-navigation/nav-drawer.htmlФрагмент Загрузка транзакции пустой вид, но фрагмент показан после вращающегося устройства

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

public void selectNavActivty(int position){ 
    // TODO Changing between the different screens selection 
    fragment = null; 
    switch (position) { 
     case 0: 
      fragment = OverLay.newInstance(); 
      break; 
     case 1: 
      fragment = Dummy.newInstance(); 
      break; 
     } 

    if(fragment != null) { 
     // attach added to handle viewpager fragments 
     FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 
     trans.replace(R.id.content_frame, fragment).attach(fragment) 
      .addToBackStack(null); 

     trans.commit(); 
     getFragmentManager().executePendingTransactions(); 
    } else { 
     Log.d("Drawer Activity","Error in creating Fragment"); 
    } 
} 
+1

У меня ТАКАЯ проблема. Это не распространено. Это происходит 1 из 20 попыток. onActivityCreated создается, представление может быть пустым ИЛИ часть представления может быть пустой ... Я добавляю вместо замены. – apmartin1991

+0

@ apmartin1991 вы можете предоставить фрагменты кода где-то здесь (например, gist.github.com) - было бы легче понять основную причину? (в исходном сообщении, например, вызывается .attach(), но не нужно, и нет необходимости называть 'executePendingTransactions()', например, но мы ничего не знаем о вашей проблеме. –

+0

Konstantin Loginov - Вот мой вопрос о том же: http://stackoverflow.com/questions/34742360/fragment-transaction-loads-a-blank-view – apmartin1991

ответ

5

Для операций фрагмента меню навигации Я использую следующий подход, таким образом фрагмент будет добавлен и помещен сверху.

String name = "myFragment"; 
getSupportFragmentManager() 
.beginTransaction() 
.replace(R.id.content_frame, fragment, name) 
.commit(); 

Посмотрите функцию attach(). Он следует за другим жизненным циклом фрагмента. Также убедитесь в том, что на вашем экране видна рамка.

0

Измените код, как показано ниже:

if(fragment != null) { 
     // attach added to handle viewpager fragments 
     FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 
     trans.replace(R.id.content_frame, fragment); 
     trans.addToBackStack(null); 
     trans.commit(); 
    } else { 
     Log.d("Drawer Activity","Error in creating Fragment"); 
    } 

Если решение не работает для вас, поделитесь кодом XML вместе с кодом фрагмента.

+1

Разве это не просто копирование-вставка @ Ответ Veedka? –

0

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

https://stackoverflow.com/a/18979024/3329488

0

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

public void selectNavActivty(int position){ 
// TODO Changing between the different screens selection 

    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragment = fragmentManager.findFragmentById(R.id.content_frame); 
    String fragmentTag = null; 
    switch (position) { 
     case 0: 
      fragmentTag = "case0Tag"; // please change to better tag name 
      break; 
     case 1: 
      fragmentTag = "case1Tag"; // please change to better tag name 
      break; 
     default: 
      Log.d("Drawer Activity","Error in creating Fragment"); 
      return; 
    } 
    if (fragmentTag != null && !fragment.getTag().equals(fragmentTag)) 
    fragmentManager.beginTransaction().replace(R.id.content_fragment, fragment, tag).commit(); 
} 
Смежные вопросы