Я играю с фрагментами в Android.
Я знаю, что могу изменить фрагмент, используя следующий код:
FragmentManager fragMgr = getSupportFragmentManager();
FragmentTransaction fragTrans = fragMgr.beginTransaction();
MyFragment myFragment = new MyFragment(); //my custom fragment
fragTrans.replace(android.R.id.content, myFragment);
fragTrans.addToBackStack(null);
fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragTrans.commit();
У меня вопрос в файле Java, как я могу получить отображаемый в данный момент экземпляр фрагмента?
Ответы:
Когда вы добавляете фрагмент в вашу транзакцию, вы должны использовать тег.
... и позже, если вы хотите проверить, виден ли фрагмент:
Смотрите также http://developer.android.com/reference/android/app/Fragment.html
источник
Я знаю, что это старый пост, но раньше у него тоже были проблемы. Нашел решение, которое должно было сделать это в
onBackStackChanged()
функции прослушиванияЭто сработало для меня, так как я не хотел перебирать каждый фрагмент, чтобы найти видимый. Надеюсь, это поможет кому-то еще.
источник
.getFragmentManager
сообщений о несовместимом типе, как это было в моем случае, это потому, что я использовалandroid.support.app.v4.Fragment
, и в этом случае правильный метод для использованияgetSupportFragmentManager
findFragmentByTag()
вместоfindFragmentById
, если вы предоставили тег для фрагмента при добавлении егоfragmentManager.beginTransaction() .add(containerID, frag, fragmentTag) .addToBackStack(fragmentTag) .commit();
Вот мое решение, которое я считаю полезным для сценариев с малым количеством фрагментов
источник
fragment
может быть нулевым в определенных сценариях, например, когда вы открываете задний стек. Так что лучше используйтеif (fragment != null && fragment.isVisible())
.Каждый раз, когда вы показываете фрагмент, вы должны поместить его в backstack:
И тогда, когда вам нужно получить текущий фрагмент, вы можете использовать этот метод:
источник
addToBackStack(tag)
, но что, если вы не хотите добавлять фрагмент в задний стек?То, что я использую для поиска текущего отображаемого фрагмента, приведено ниже. Это просто и у меня работает. Это работает в деятельности, которая содержит фрагменты
источник
fragManager.getFragments().size()
а неgetBackStackEntryCount()
как они не обязательно равны (что мой случай). В противном случае вы можете получить сбой с помощью IndexOutOfBoundsExceptionКотлин путь;
источник
getFragments()
, которая является API 26 и выше.Реактивный способ:
источник
Мой метод основан на try / catch:
Но может быть лучше ...
источник
Ну, этот вопрос получил много взглядов и внимания, но все еще не содержал самого простого решения с моей стороны - использовать getFragments ().
источник
getSupportFragmentManager().getFragments()
возвращает список, но он может содержать нулевые значения, если последний фрагмент только что извлечен из backstack. Eq: Если вы проверите свой путь внутриonBackStackChanged()
метода и вызоветеpopBackStack()
куда-то, тоmCurrentFragment
будетnull
.Вы можете запросить, какой фрагмент загружен в ваш фрейм контента «Деятельности», и извлечь класс фрагмента или фрагмент «простого имени» (в виде строки).
Применение:
Выходы:
источник
Это немного поздно, но для тех, кто заинтересован: если вы знаете индекс нужного вам фрагмента во FragmentManager, просто получите ссылку на него и проверьте функцию isMenuVisible ()! Вот :
Если
true
его видно пользователю и так далее!источник
isVisible() == true
,getView() != null
. Плюс в моем кодеgetBackStackEntryCount
всегда ноль. Несмотря на то, что я не использую меню,isMenuVisible()
это пока единственный дискриминант, который, кажется, надежно указывает на текущий «активный» фрагмент. ты1)
2)
3)
источник
Если попасть сюда и вы используете Kotlin:
R.id.fragment_container
этоid
гдеfragment
представляет на ихactivity
Или, если вы хотите более хорошее решение:
источник
Вдохновленный ответом Тайны , вот мои два цента. Немного изменен от большинства других реализаций.
Замените
"myActivity"
на «this», если это ваша текущая деятельность, или используйте ссылку на вашу деятельность.источник
Есть метод, вызванный
findFragmentById()
вSupportFragmentManager
. Я использую его в контейнере активности, как:Вот как получить свой ток
Fragment
. Если у вас есть кастомFragment
и вам нужно проверить, чтоFragment
это такое, я обычно используюinstanceof
:источник
Если вы используете
AndroidX Navigation
:Для получения дополнительной информации об этом компоненте навигации: https://developer.android.com/guide/navigation/navigation-getting-started
источник
your_navhost
.Это простой способ получить текущий фрагмент.
источник
Ответ Сев работает, когда вы нажимаете кнопку «Назад» или иным образом меняете бэкстек.
Я сделал что-то немного другое, хотя. У меня есть настройка прослушивателя изменений обратного стека на базовом фрагменте и его производных фрагментах, и этот код находится в прослушивателе:
источник
Это работа для меня. Я надеюсь, что это кого-то поможет.
источник
Если вы получаете текущий экземпляр Fragment от родительского действия, вы можете просто
Это на самом деле получить текущий экземпляр фрагмента, который заполняется в представлении. Я была такая же проблема. Я должен был загрузить один и тот же фрагмент дважды, оставив один на backstack.
Следующий метод не работает. Он просто получает фрагмент с тегом. Не тратьте свое время на этот метод. Я уверен, что он использует его, но получить самую последнюю версию того же фрагмента не является одним из них.
источник
Оформить заказ на это решение. Это помогло мне получить текущий фрагмент.
источник
источник
Ну, я думаю, это самый прямой ответ на этот вопрос. Надеюсь, это поможет.
источник
Вот решение Kotlin:
Упрощенный способ:
источник
Простой способ сделать это:
источник
В основном упражнении метод onAttachFragment (фрагмент фрагмента) вызывается, когда к действию присоединяется новый фрагмент. В этом методе вы можете получить экземпляр текущего фрагмента. Однако метод onAttachFragment не вызывается, когда фрагмент извлекается из стека назад, т. Е. Когда нажимается кнопка «Назад», чтобы получить верхний фрагмент поверх стека. Я все еще ищу метод обратного вызова, который запускается в основном действии, когда фрагмент становится видимым внутри действия.
источник
В случае прокручиваемых фрагментов, когда вы используете экземпляр класса ViewPager, предположите mVeiwPager, вы можете вызвать mViewPager.getCurrentItem () для получения текущего номера int фрагмента.
в MainLayout.xml
в MainActivity.kt
источник
Я обнаружил, что
findFragmentByTag
это не так удобно. Если у вас естьString currentFragmentTag
вашActivity
или родительFragment
, вы должны сохранить егоonSaveInstanceState
и восстановить егоonCreate
. Даже если вы это сделаете, когдаActivity
воссозданный,onAttachFragment
будет вызван раньшеonCreate
, поэтому вы не можете использоватьcurrentFragmentTag
вonAttachFragment
(например, обновить некоторые представления на основеcurrentFragmentTag
), потому что это , возможно , еще не восстановлена.Я использую следующий код:
Документ о
FragmentManager
том, чтоКогда вам нужно сделать что-то на основе текущего типа фрагмента, просто используйте
getCurrentFragment() instance of MyFragment
вместоcurrentFragmentTag.equals("my_fragment_tag")
.Обратите внимание, что
getCurrentFragment()
inonAttachFragment
не получит присоединениеFragment
, но предыдущее прикрепленное.источник
Я должен был сделать это совсем недавно, и ни один из ответов здесь действительно не подходил для этого сценария.
Если вы уверены, что будет виден только один фрагмент (в полноэкранном режиме), так что действительно хотите найти то, что находится на вершине backstack. Например,
Kotlin
дляFragment
:И используйте это как:
источник
Вы можете сделать это очень легко также с помощью URL в logcat, который перенаправит вас на исходный код текущего фрагмента исходного кода. Во-первых, вам нужно добавить OnBackStackChangedListener в активность хоста, как -
А реализация OnBackStackChangedListener - это
И метод getStackTopName () -
источник