Фрагменты, отображаемые друг над другом

У меня есть Activity с DrawerLayout, используя рекомендации от http://developer.android.com/training/implementing-navigation/nav-drawer.html .

Когда я нажимаю на drawerItem, я заменяю текущее представление на новый фрагмент:

Fragment fragment; Bundle args = new Bundle(); fragment = new NewsListFragment(); args.putInt("category", position); // Insert the fragment by replacing any existing fragment FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.content_frame, fragment) .commit(); mDrawerList.setItemChecked(position, true); 

Теперь иногда старый фрагмент не заменяется, но новый фрагмент помещается поверх старого:

http://img15.imageshack.us/img15/3179/1kqj.png

Почему это и как решить эту проблему?

Соответствующий XML:

 <!-- The main content view --> <LinearLayout android:id="@+id/rlMain" android:layout_width="fill_parent" android:orientation="vertical" android:layout_height="fill_parent"> <FrameLayout android:id="@+id/content_frame" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"> </FrameLayout> 

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

Solutions Collecting From Web of "Фрагменты, отображаемые друг над другом"

Мы поехали вживую с этой версией и havent получили какие-либо жалобы по этому поводу, поэтому я предполагаю, что это был правильный ответ:

В вашем методе onCreateView добавьте:

 if (container != null) { container.removeAllViews(); } 

Обязательно проверьте, не является ли контейнер нулевым!

Спасибо https://stackoverflow.com/users/2677588/lia-pronina !

Примерно через 1 неделю я нашел решение без добавления цвета фона или чего-то еще. Просто добавьте этот код и исправьте эту ерунду. Надеюсь, это поможет всем вам.

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment container.clearDisappearingChildren(); return inflater.inflate(R.layout.fragment, container, false); } 

Давайте попробуем с

 fragmentManager.beginTransaction().executePendingTransactions(); 

После вызова метода commit ()

Добавить в каждый макет

 android:background="#FFFFFF" 

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

Я столкнулся с этой проблемой, и я вижу, что есть уже принятый ответ, но этот ответ не на 100% прав и не исправил мою проблему. Предлагаемый ответ @Niels удаляет представления, но фрагмент (и) все еще добавлен. Это то, что я использую:

 /** * Call this to remove all the other added fragments and keep only the current one. * * @param activity the activity to which the fragment has been attached. * @param fragment the fragment we want to keep. */ public static void removeOtherAddedFragments(@NonNull AppCompatActivity activity, @NonNull Fragment fragment) { FragmentManager fragmentManager = activity.getSupportFragmentManager(); for (Fragment frag : fragmentManager.getFragments()) { if (frag != null && !frag.equals(fragment) && frag.isAdded()) { fragmentManager.beginTransaction().remove(frag).commit(); } } } 

Я называю это в своем onResume, чтобы быть уверенным, что он будет вызван также, когда я вернусь к фрагменту.