2013-05-27 5 views
12

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

Фрагменты загружаются через onItemClick метод реализации AdapterView.OnItemClickListener на мою деятельность.

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    Fragment fragmentToShow = null; 
    // Load desired fragment 
    switch (position) { 
     case 0: // Authors 
      if (fragmentAuthors == null) fragmentAuthors = new FragmentAuthors(); 
      fragmentToShow = fragmentAuthors; 
      break; 
     case 1: // Books 
      if (fragmentBooks == null) fragmentBooks = new FragmentBooks(); 
      fragmentToShow = fragmentBooks; 
      break; 
    } 
    FragmentTransaction ft = fragmentManager.beginTransaction(); 
    ft.replace(R.id.ActivityMain_Drawer_FrameMain, fragmentToShow); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
    ft.commit(); 
    mDrawerLayout.closeDrawers(); 
} 

Layout

<!-- The main content view --> 
<FrameLayout 
    android:id="@+id/ActivityMain_Drawer_FrameMain" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/background_light" /> 

<!-- The navigation drawer --> 
<FrameLayout 
    android:id="@+id/ActivityMain_Drawer_FrameMenu" 
    android:layout_width="240dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:background="@android:color/background_light"> 
    <ListView 
     android:id="@+id/ActivityMain_Drawer_FrameMenu_List" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:choiceMode="singleChoice" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="0dp" /> 
</FrameLayout> 

Скриншоты

https://dl.dropboxusercontent.com/u/1763308/Screenshots/device-2013-05-27-113128.png https://dl.dropboxusercontent.com/u/1763308/Screenshots/device-2013-05-27-113139.png

ответ

11

У меня такая же проблема с некоторыми фрагментами. Чтобы решить это я простой цвет фона набор для всех макетов фрагментов, например:

android:background="?android:attr/colorBackground" 
+12

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

+5

Я предполагаю, что это будет добавьте лишнюю ничью, делая анимацию ui менее жидкой. Это не решает вашу проблему, но буквально скрывает ее. – MinceMan

+2

Я не думаю, что это хорошее решение. – rgv

0

Попробуйте изменить Android: фон = «@ Android: цвет/background_light» цвет какой-то другой color.May быть это решает твоя проблема.

+0

Я тестировал изменение статического цвета, например,'android: background = "# F00" или используя ссылки на системные цвета, но результат тот же. Оба фрагмента отображаются, и они не реагируют на ввод. – Zetch

+0

См. Эту страницу http://developer.android.com/training/implementing-navigation/nav-drawer.html Попробуйте загрузить образец проекта и сравнить его с вашим существующим проектом. Попробуйте удалить ft.setTransition (FragmentTransaction.TRANSIT_FRAGMENT_FADE); эту строку и запустить. –

+0

Хорошо, я пробовал задавать цвет фона на каждом фрейме и каждом макете Фрагмента, и, похоже, он работает нормально. Но теперь у меня другая проблема: каждая загруженная загрузка фрагмента выполняется нормально, но если я снова загружаю их, ListViews пуст. Каждый ListView имеет ArrayAdapter, который загружается при вызове 'onActivityCreated' каждого фрагмента. – Zetch

1

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

Мое решение переопределить onBackPressed метод на операцию удержания контейнера фрагмент, поэтому каждый раз при нажатии кнопки назад я удалить текущий показанный фрагмент и вернуть предыдущую:

@Override 
public void onBackPressed() { 
    List<Fragment> fragments = getSupportFragmentManager().getFragments(); 
    if (fragments.size() > 1) { 

     final Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.my_framelayout); 
     if (currentFragment != null) { 
      getSupportFragmentManager().beginTransaction().remove(currentFragment).commit(); 
      getSupportFragmentManager().popBackStack(); 
     } 
    } else { 
     super.onBackPressed(); 
    } 
} 

Надежда это помогает.

Смежные вопросы