nel mio caso volevo avviare alcune animazioni nelle viste, ma con setUserVisibleHint ho avuto alcuni problemi ... la
mia soluzione è:
1 / addOnPageChangeListener per l'adattatore:
mViewPager.addOnPageChangeListener(this);
2 / implementare OnPageChangeListener:
public class PagesFragment extends Fragment implements ViewPager.OnPageChangeListener
3 / sovrascrivi i 3 metodi:
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
{
}
@Override
public void onPageSelected(int position)
{
}
@Override
public void onPageScrollStateChanged(int state)
{
}
4 / dichiara e inizializza questa variabile sulla tua classe
private static int mTabState = 1;
avviso : ho tre frammenti nel mio adattatore e uso mTabState per setCurrentItem e la posizione corrente dell'adattatore che riconoscono quale frammento viene mostrato all'utente nel tempo ... 5 / nel metodo onPageSelected aggiungi questi codici:
if (mTabState == 0 || position == 0)
{
Intent intent = new Intent("animation");
intent.putExtra("current_position", position);
LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
}
se la pagina precedente o la pagina corrente è la pagina 0 (frammento in posizione 0) allora fai questa roba
6 / ora nella tua classe di frammento (frammento nella posizione 0 dell'adattatore), devi creare il ricevitore di trasmissione e registrarlo nel metodo onResume e annullarne la registrazione suPause methos:
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);
}
riepilogo: ho un adattatore per cercapersone per frammenti che mostra tre frammenti, voglio mostrare alcune animazioni sulle viste in frammento nella posizione 0 dell'adattatore, per questo utilizzo BroadcastReceiver. Quando il frammento viene selezionato, avvio il metodo di animazione e mostra le visualizzazioni all'utente, quando il frammento non viene mostrato all'utente provo a visualizzazioni invisibili ...