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

У меня есть 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>

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

Ответы

Ответ 1

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

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

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

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

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

Ответ 2

Примерно через 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);
}

Ответ 3

попробуйте с

fragmentManager.beginTransaction().executePendingTransactions();

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

Ответ 4

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

android:background="#FFFFFF"

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

Ответ 5

Я запускаюсь в этой же проблеме, и вижу, что есть уже принятый ответ, но этот ответ не на 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, чтобы быть уверенным, что он будет вызван также, когда я вернусь к фрагменту.