ViewPager
私はMedia
Images、Videos、Audioのようなファイルを表示しているシングル・フラグメント・インスタンスで使用しています。ExplayerをViewPagerのスワイプで停止する
Video
& Audio
ファイルを処理するためにExoPlayer
を実装しました。画像の場合はGlide
です。私はItemViewerFragment.java
にこのようなExoPlayer
オブジェクトを解放していたメモリリークを回避するためにthisから
:
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();
}
そしてonViewCreated()
に、私はこのようなビューの初期化しています:
@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);
}
}
を私はFragmentStatePagerAdapeter
を使用しています。
@Override
public Fragment getItem(int position) {
return ItemViewerFragment.newInstance(mItems.get(position));
}
私はViewpager
の最初のスワイプにフラグメントのを検出することはできませんよ:これはgetItem
方法です。 2回目のスワイプでは、ファイルの再生が停止されます。video/audio
活動で
私は.addOnPageChangeListener
を追加しようとしている:
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
try {
((ItemViewerFragment)mAdapter.getItem(mPreviousPos)).imHiddenNow();
} catch (Exception e) {
e.printStackTrace();
}
mPreviousPos = position;
}
そしてItemViewerFragment.java
中:
public void imHiddenNow(){
releasePlayer();
}
はまだvideo/audio
演奏を続けています。
ScreencastにはVideo Linkがあります。
の投稿のソリューションが動作しないことにご注意ください。ここで
はどのようにonScrollListenerの前の位置を取得していますか? –
さらに、getItemメソッドが毎回newInstanceを返すことが原因である可能性があります。 –
初期化中に表示されている 'GalleryModel'の現在の位置を保存しています。私のリストに30項目あり、私は5点を表示しています。それから 'onScroll'は前の位置が5位になり、現在の位置はスクロールされた位置によって4位か6位になります。 –