Я использую следующий метод для переключения между фрагментами (в моем NavigationDrawer), показывая / скрывая их.
protected void showFragment(int container, Fragment fragment, String tag, String lastTag, boolean addToBackStack ) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
if ( lastTag != null && !lastTag.equals("")) {
Fragment lastFragment = fragmentManager.findFragmentByTag( lastTag );
if ( lastFragment != null ) {
transaction.hide( lastFragment );
}
}
if ( fragment.isAdded() ) {
transaction.show( fragment );
}
else {
transaction.add( container, fragment, tag );
}
if ( addToBackStack ) {
transaction.addToBackStack( tag );
}
transaction.commit();
// set the active tag
activeFragTag = tag;
}
Я не понимаю, какой метод жизненного цикла фрагментов вызывается, когда я его показываю или скрываю? (поскольку нет таких методов, как onShow () или onHide (), я не совсем уверен, что использовать). Я хочу выполнить определенные действия при отображении и скрытии определенного фрагмента.
android
android-fragments
lifecycle
fragmenttransaction
Филипп Яхода
источник
источник
onCreate()
, за которымonCreateDialog()
следуетonCreateView()
Ответы:
Подобно жизненному циклу активности, Android вызывает onStart (), когда фрагмент становится видимым.
onStop()
обычно вызывается, когда фрагмент становится невидимым, но его также можно вызвать позже.В зависимости от вашего макета Android может вызывать
onStart()
даже тогда, когда ваш фрагмент еще не виден, но принадлежит видимому родительскому контейнеру. Например, это действительно для того,android.support.v4.view.ViewPager
что требует от вас переопределенияFragment.setUserVisibleHint()
метода. В любом случае, если вам нужно зарегистрировать / отменить регистрацию BroadcastReceivers или других слушателей, вы можете безопасно использоватьonStart()
иonStop()
методы , потому что те будут называться всегда.Примечание. Некоторые контейнеры фрагментов могут сохранять невидимые фрагменты запущенными. Чтобы справиться с этой ситуацией, вы можете переопределить
Fragment.onHiddenChanged(boolean hidden)
. Согласно документации , фрагмент должен быть как запущенным, так и видимым (не скрытым) , чтобы он был виден пользователю.Обновление: если вы используете,
android.support.v4.widget.DrawerLayout
то фрагмент под ящиком остается включенным и видимым, даже когда ящик открыт. В этом случае вы должны использоватьDrawerLayout.setDrawerListener()
и слушатьonDrawerClosed()
иonDrawerOpened()
обратные вызовы.источник
onStop
иonPause
не вызываются, когда фрагмент становится невидимым с помощью транзакции. Тем не менее,onHiddenChanged
это называется, как предполагает ответ s1riusЯ @Override этот метод и решаю свою проблему:
источник
setUserVisibleHint
как показано в stackoverflow.com/a/18375436/1815624, работаетконечно, вы можете сделать это с помощью @Override:
источник
getUserVisibleHint()
Поведение пейджера «Фрагмент в представлении» отличается от обычного контейнера фрагментов.
Попробуйте этот код:
источник
Попробуйте этот код:
источник
Вы можете использовать onCreateView (или onActivityCreated) и onHiddenChanged. Используйте onCreateView для первого показа и используйте onHiddenChanged для последующего использования. setMenuVisibility не вызывается для управления транзакциями.
источник
Просто попробуйте это в своем setUserVisibleHint ()
И создайте этот код в onCreateView () :
источник
isVisibleToUser && getView() != null
работал идеально для меня!// в первую очередь вы создаете интерфейс
// После этого этот интерфейс реализуем внутри фрагмента вот так
// Теперь переходим к вашему Activity, затем создаем объект интерфейса и вызываем внутри, когда addOnViewpagerListener
источник
setUserVisibleHint
звоните раньшеonCreateView
. и вы не можете обновить любой вид внутри setUserVisibleHint, который я используюдля видимости, и onHiddenChanged () не вызывается впервые . он вызывается при изменении скрытого состояния. потому что
fragment is visible by default
. Чтобы использовать этот метод впервые, вам нужно позвонить,mFragmentTransaction.hide(oldFragment)
тогда он будет работатьЗаметка
если вы хотите использовать подсказку setUserVisible и обновить представление Используйте этот метод
источник
Конечно, вы можете переопределить
setUserVisibleHint
или,setMenuVisibility
но если вам нужно получить доступContext
илиActivity
, они будут там нулевыми! Существует еще один метод,onStart
который всегда имеет контекст под рукой, но он будет вызываться только один раз при создании фрагмента, и если вы начнете перемещаться между своими фрагментами в пейджере, вы увидите, что он не будет вызываться во втором представлении, а затем .Итак ... что теперь делать?
Обходной путь довольно прост, используйте
onStart
как при первом посещении, так иsetMenuVisibility
при последующих. Ваш код, вероятно, будет выглядеть так:Класс фрагмента:
Этот способ
Context
всегда будет доступен дляdoSth()
метода.источник
Только это сработало для меня !! и
setUserVisibleHint(...)
теперь устарел (я приложил документы в конце), что означает, что некоторые другие ответы устарели ;-)Протестировано и работает
NaviagationDrawer
,isMenuVisible()
всегда будет возвращениеtrue
(иonResume()
кажется достаточно, но мыViewPager
тоже хотим поддержать ).источник