Деятельность:
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment1 fragment = new Fragment1();
Fragment2 fragment2 = new Fragment2();
transaction.replace(R.id.Fragment1, fragment);
transaction.addToBackStack(null);
transaction.commit();
FragmentTransaction transaction2 = getSupportFragmentManager().beginTransaction();
transaction2.replace(R.id.Fragment1, fragment2);
transaction2.addToBackStack(null);
transaction2.commit();
Код в представлении:
<fragment
android:id="@+id/Fragment1"
android:name="com.landa.fragment.Fragment1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_below="@+id/include1" />
Проблема в том, что на самом деле контент не заменяется - он помещается сверху (поэтому он перекрывается).
Когда я нажимаю кнопку "Назад", первый фрагмент отображается правильно (без второго), но изначально оба видны (я хочу, чтобы был виден только последний).
Что мне здесь не хватает?
android
android-fragments
Инструмент
источник
источник
containerViewId
(вreplace
методе).Ответы:
Здесь вы делаете две ошибки:
Вы не можете заменить фрагмент, который статически помещен в
xml
файл макета. Вы должны создать контейнер (например, aFrameLayout
) в макете, а затем программно добавить фрагмент, используяFragmentTransaction
.FragmentTransaction.replace
ожидает идентификатор контейнера, который содержит фрагмент, а не идентификатор фрагмента в качестве первого параметра. Таким образом, вы должны передать первый аргумент в качестве идентификатора контейнера, в который вы добавили первый фрагмент.Вы можете обратиться к этой ссылке для получения более подробной информации.
источник
FrameLayout
Лучше использовать в качестве контейнера, чем использоватьLinearLayout
.addTobackStack(..)
при совершении транзакции в первый раз. Это позволит избежать помещения пустого контейнера FrameLayout в задний стек. Вы по-прежнему сможете вернуться к добавляемому фрагменту.У меня была аналогичная проблема, но моя проблема заключалась в том, что я использовал два разных менеджера фрагментов: один от
getSupportFragmentManager()
и один отgetFragmentManager()
. Если бы я добавил один фрагмент с помощью,SupportFragmentManager
а затем попытался заменить фрагмент наFragmentManager
, фрагмент просто добавился бы поверх. Мне нужно было изменить код, чтобы использовать тот же код,FragmentManager
и это решило проблему.источник
Сайт разработчика Android предлагает использовать
FrameLayout
для динамической загрузки фрагментов во время выполнения. Вы жестко запрограммировали фрагмент в своем XML-файле. Поэтому его нельзя удалить во время выполнения, как указано в этой ссылке:http://developer.android.com/training/basics/fragments/creating.html
по этой ссылке показано, как добавлять фрагменты через вашу программу:
http://developer.android.com/training/basics/fragments/fragment-ui.html
источник
У меня была та же проблема, и я видел все ответы, но ни один из них не содержал моей ошибки! Прежде чем пытаться заменить текущий фрагмент, я показывал фрагмент по умолчанию в xml активности контейнера следующим образом:
после этого, хотя я проходил мимо
FrameLayout
к ,fragmentTransaction.replace()
но я имел точную проблему. он показывал второй фрагмент поверх предыдущего.Проблема устранена удалением фрагмента из xml и его программным отображением в
onCreate()
методе активности контейнера для предварительного просмотра по умолчанию при запуске программы следующим образом:и активность контейнера xml:
источник
Вы можете очистить backStack перед заменой фрагментов:
источник
Добавьте
android:background="?android:windowBackground">
в контейнер, в котором находится ваш фрагмент. В моем случае я добавилFrameLayout
, что должно помочь.источник
Используйте контейнер вместо фрагмента
Сейчас в MainActivity
Обратите внимание, что ваш класс фрагмента должен импортировать 'android.app.Fragment'. Убедитесь, что вы используете «support.v4» или «оригинальные» реализации и не смешиваете их. У меня возникла эта проблема, потому что я их смешал.
источник
Я согласен с ответом Сапана Дивакара. Но я нашел обходной путь, как это сделать.
Во-первых, в вашей деятельности (например
activity_main
), где у вас есть все макеты, добавьте файлFrameLayout
. Его высота и ширина должны бытьmatch parent
. Кроме того, дайте емуid
.Теперь в вашем фрагменте, который заменит текущий макет, вызовите
onPause()
иonResume()
. Инициализируйте все внутренние контейнерыView
. И установить ихvisibility
ToGONE
вonResume()
иVISIBLE
вonPause()
.ПРИМЕЧАНИЕ . Не тот,
FrameLayout
который вы заменяете этим фрагментом.Предположим , что у вас есть
ViewPager
,TabLayout
,ImageView
и обычай<fragment>
вactivity_main.xml
. Добавьте,FrameLayout
как указано выше.В
abcFragment.java
, вonClick()
функции, добавьтеaddToBackstack(null)
вtransaction
.Пример кода:
в xyzFragment, который заменит abcFragment (и все, что показано в activity_main.xml), сделайте это
Удачного кодирования!
источник
Вы можете использовать метод setTransition из FragmentTransaction, чтобы исправить проблему перекрытия.
источник
В Oncreate ()
теперь это всегда будет ваш фрагмент по умолчанию ... если вы добавите фрагмент в макет xml, он всегда будет перекрываться, поэтому установите исходное содержимое с фрагментом во время выполнения
источник
У меня была такая же проблема после решения этой проблемы
Возьмите макет кадра, где вы заменяете фрагмент ur
и код для замены
Если вам нужен весь пример, я пришлю вам комментарий ...
источник
У меня также была такая же проблема, но это было потому, что я не изменил цвет фона фрагмента, который я пытался добавить в свой макет кадра.
Попробуйте сделать это с помощью
layout_height
иlayout_width
установитеmatch_parent
источник
Однажды у меня была эта проблема, и я обнаружил, что это произошло потому, что я случайно удалил
android:background
атрибут, который отсутствует в вашем xml-коде. Я считаю, что это работает так, как если бы вы красили стену,android:background
это цвет стены, а другие виды помещаются поверх этого основного цвета. Если вы не раскрашиваете стену до того, как разместите свои виды, они будут поверх того, что уже было в этой стене, в вашем случае, вашего другого фрагмента. Не знаю, поможет ли это вам, удачи.источник
Я пробовал, прежде всего, этот случай и пытаюсь решить проблему, но все еще не нашел решения. Я не знаю, почему у меня это не работает. Я согласен с приведенными выше ответами, потому что многие с ними согласны.
Я просто расширяю ответ, и ниже приведен способ, который работает для меня.
Надеюсь, кому-нибудь помогут.
источник
Спасибо Сапану Дивакару и другим. Этот ответ мне помог. Я просто создал RelativeLayout без фрагмента внутри, использовал RelativeLayout в качестве родительского или группового представления, указал это групповое представление в транзакции для замены, и это сработало.
Код:
XML:
источник
Проверьте идентификатор макета кадра и замените его, как показано ниже.
источник