Обнаружение изменения вкладки ViewPager внутри фрагмента

У меня есть ViewPager с несколькими фрагментами. В одном Fragment я воспроизвожу аудио. Когда я сажусь на другой фрагмент, я хочу остановить воспроизведение звука. Как определить, что другой фрагмент теперь отображается в ViewPager?

Я пробовал переопределить onStop и onHiddenChanged. Нет успеха. Должен быть некорректный метод "вы не активны". Нет?

Ответ 1

Я немного поработал, и оказалось, что ViewPager вызовет оба: setUserVisibleHint и setMenuVisibility. Я бы переопределил setUserVisibleHint, поскольку документация для setUserVisibleHint утверждает:

Настройте подсказку системе о том, является ли этот пользовательский интерфейс фрагмента видимым для пользователя. Эта подсказка по умолчанию имеет значение true и постоянна для сохранения и восстановления состояния экземпляра экземпляра. Приложение может установить это значение в false, чтобы указать, что пользовательский интерфейс фрагмента прокручивается вне видимости или в противном случае не отображается непосредственно пользователю. Это может использоваться системой для приоритизации операций, таких как обновление жизненного цикла фрагмента или поведение порядка загрузки.

Попробуйте поместить этот код в свой фрагмент:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    // Make sure that we are currently visible
    if (this.isVisible()) {
        // If we are becoming invisible, then...
        if (!isVisibleToUser) {
            Log.d("MyFragment", "Not visible anymore.  Stopping audio.");
            // TODO stop audio playback
        }
    }
}