Как проверить, виден ли фрагмент пользователю

#android #fragment

Вопрос:

Как проверить, виден ли фрагмент пользователю в приложении для Android?

У меня есть приложение, в котором в доме activity их несколько fragments . Один из фрагментов прослушивает события из другого действия, запущенного из дома, и, следовательно, выполняет метод каждый раз, когда я возвращаюсь домой из этого действия. В то время как я хочу, чтобы эти события запускались только и выполнялся метод, если фрагмент виден пользователю на переднем плане.

Я попробовал следующее, но, похоже, ничего не получилось:

  1. isAdded() и isVisible() проверьте — всегда возвращайтесь true , как только фрагмент будет создан, независимо от того, действительно ли фрагмент виден пользователю или нет.
  2. getUserVisibleHint() — это снова вернулось true бы, даже если бы я все еще занимался другой деятельностью. Кроме того, он также устарел, поэтому, даже если бы это сработало, я бы хотел поискать другое решение.

Я зашел в тупик, чтобы найти реальный рабочий способ проверить, действительно ли фрагмент виден пользователю, а не просто добавлен в память.

Любая помощь в этом приветствуется!

Ответ №1:

Я, наконец, наткнулся на решение, пытаясь сам:

Простая проверка isResumed() , и она вернет значение true только в том случае, если фрагмент находится на переднем плане и возобновлен.

Просто на всякий случай проверьте, для isVisible чего также isAdded выполняется внутренняя проверка и уменьшит состояние, поэтому простое if-condition :

 if (isVisible() amp;amp; isResumed()) {
    // perform your action here
}
 

Это сработало для меня!

Комментарии:

1. Почему вы добавили isResumed() ? А что, если над фрагментом отображается фрагмент диалога? В этом случае фрагмент уже виден.

2. 1. Если над ним находится другой фрагмент или фрагмент диалога, предыдущий фрагмент не вернет значение true isResumed , пока диалоговое окно не будет закрыто и фрагмент не выйдет на передний план. 2. Мой вариант использования возвращался из другого действия обратно к этому фрагменту вместо любого другого случая, такого как диалог или что-то еще, для которого статус возобновления, похоже, работает для меня.