в моем случае я хотел запустить некоторые анимации в представлениях, но с setUserVisibleHint возникли некоторые проблемы ...
мое решение:
1 / addOnPageChangeListener для вашего адаптера:
mViewPager.addOnPageChangeListener(this);
2 / реализовать OnPageChangeListener:
public class PagesFragment extends Fragment implements ViewPager.OnPageChangeListener
3 / переопределить 3 метода:
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
{
}
@Override
public void onPageSelected(int position)
{
}
@Override
public void onPageScrollStateChanged(int state)
{
}
4 / объявить и инициализировать эту переменную в вашем классе
private static int mTabState = 1;
Примечание : у меня есть три фрагмента в моем адаптере, и я использую mTabState для setCurrentItem и текущей позиции адаптера, которые распознают, какой фрагмент отображается пользователю во времени ... 5 / в методе onPageSelected добавьте эти коды:
if (mTabState == 0 || position == 0)
{
Intent intent = new Intent("animation");
intent.putExtra("current_position", position);
LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
}
если предыдущая страница или текущая страница - страница 0 (фрагмент в позиции 0), то сделайте это
6 / теперь в вашем классе фрагмента (фрагмент в позиции 0 адаптера) вы должны создать широковещательный приемник и зарегистрировать его в методе onResume и отменить регистрацию в методах onPause:
BroadcastReceiver broadcastReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
if (Objects.equals(intent.getAction(), "animation"))
{
int currentPosition = intent.getIntExtra("current_position", 0);
if (currentPosition == 0)
{
startAnimation();
setViewsVisible();
} else
{
setViewsInvisible();
}
}
}
};
@Override
public void onResume()
{
super.onResume();
LocalBroadcastManager.getInstance(mContext).registerReceiver(broadcastReceiver, new IntentFilter("animation"));
}
@Override
public void onPause()
{
super.onPause();
LocalBroadcastManager.getInstance(mContext).unregisterReceiver(broadcastReceiver);
}
Резюме: у меня есть Fragment Pager Adapter, который показывает в нем три фрагмента, я хочу показать некоторые анимации в представлениях во фрагменте в позиции 0 адаптера, для этого я использую BroadcastReceiver. Когда фрагмент выбран, я запускаю метод анимации и показываю представления пользователю, когда фрагмент не отображается пользователю, я пытаюсь использовать невидимые представления ...