J'utilise un ViewPager
avec une instance de fragment unique dans laquelle je montre Media
des fichiers comme Images, Vidéos, Audio.Arrêt de Exoplayer onSwipe de ViewPager
J'ai mis en œuvre ExoPlayer
pour la gestion Video
& Audio
fichiers. Et Glide
pour les images.
De this pour éviter les fuites de mémoire je libérer l'objet ExoPlayer
comme celui-ci dans ItemViewerFragment.java
:
private void releasePlayer() {
if (player != null) {
player.release();
player = null;
trackSelector = null;
simpleExoPlayerView.setPlayer(null);
}
}
@Override
public void onStart() {
super.onStart();
if (player == null && currentGalleryModel != null) {
initializePlayer();
}
}
@Override
public void onResume() {
super.onResume();
if (player == null && currentGalleryModel != null) {
initializePlayer();
}
}
@Override
public void onPause() {
super.onPause();
releasePlayer();
}
@Override
public void onStop() {
super.onStop();
releasePlayer();
}
Et dans onViewCreated()
Je suis Initialisation vue comme ceci:
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (currentGalleryModel.isVideo() || currentGalleryModel.isAudio()) {
simpleExoPlayerView.setVisibility(View.VISIBLE);
imageView.setVisibility(View.GONE);
initializePlayer();
} else if (currentGalleryModel.isImage() || currentGalleryModel.isGif()) {
simpleExoPlayerView.setVisibility(View.GONE);
imageView.setVisibility(View.VISIBLE);
Glide.with(this)
.load(currentGalleryModel.getFilePath())
.placeholder(android.R.color.black)
.fitCenter()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
}
}
J'utilise FragmentStatePagerAdapeter
. Ceci est la méthode getItem
:
@Override
public Fragment getItem(int position) {
return ItemViewerFragment.newInstance(mItems.get(position));
}
Je ne suis pas en mesure de détecter la du fragment sur le premier coup de Viewpager
. Au deuxième balayage, les fichiers video/audio
sont arrêtés.
En activité j'ai essayé d'ajouter .addOnPageChangeListener
:
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
try {
((ItemViewerFragment)mAdapter.getItem(mPreviousPos)).imHiddenNow();
} catch (Exception e) {
e.printStackTrace();
}
mPreviousPos = position;
}
Et ItemViewerFragment.java
:
public void imHiddenNow(){
releasePlayer();
}
encore video/audio
continue à jouer. Il s'agit d'un Video Link au Screencast.
Demo project GitHub link. Veuillez noter que la solution affichée ci-dessous ne fonctionne pas
Comment obtenez-vous la position précédente dans le onScrollListener? –
Plus je vois la méthode getItem renvoie une nouvelle instance à chaque fois qui peut être la cause. –
Pendant l'initialisation, je stocke la position actuelle du 'GalleryModel' qui est en train de s'afficher. Supposons que j'ai 30 articles dans ma liste et que j'en affiche 5. Ensuite 'onScroll' la position précédente serait 5ème et le courant serait soit 4ème soit 6ème selon le côté où il a été défilé. –