背景: 我有一个 Activity 、4 个 fragment 和一个 viewPager(每个页面由一个 fragment 组成)。每个 fragment 包含一个短声音列表(每个最长 5 秒)。预期的行为是:如果用户在某个页面上点击了一个声音并且声音没有播放完,如果用户滑动到另一个页面,媒体播放器将被释放,声音将停止播放。
问题: 向左或向右滑动时,不会调用 onPause 或 onStop 方法(因为根据定义 viewPager 会加载当前页面、上一页和下一页),因此播放上一页声音的媒体播放器不会在滑动时停止。
研究:
我在多个帖子上搜索了很多,与 onPageChangeListener
、setOffScreenPageLimit
、设置 MediaPlayer 不是在 fragment 中而是在 Activity 中(在我的情况下不可能,因为我有列表声音与适配器)。以下是我研究过但没有解决我的问题的一些链接:ViewPager swipe previous sound , Multiple video players in viewpager in android , Android MediaPlayer on ViewPager blocking UI transition and no callback for initial page loads , How to handle MediaPlayer object inside a fragment inside view pager , Using Viewpager with MediaPlayer
建议?:如果您对如何解决此问题有任何建议,我们将不胜感激!谢谢!
最佳答案
您可以使用 onPageChanged()
方法在您的 MainActivity
上创建一个Callback
接口(interface),如下所示:
public interface Callback {
void onPageChanged();
}
然后,您可以使用这个OnPageChangeListener
:
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
private int currentPage = 0;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
Fragment fragment = adapter.getItem(currentPage);
if (fragment instanceof Callback &&
currentPage != position) {
((Callback)adapter.getItem(currentPage)).onPageChanged();
}
currentPage = position;
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
ViewPager 中的每个 Fragment 都可以这样创建:
public class TestFragment extends Fragment implements MainActivity.Callback {
private void releaseMediaPlayer() {
// ...
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// ...
}
@Override
public void onPageChanged() {
releaseMediaPlayer();
// You can do more things here
}
}
这样做之后,每次您更改 ViewPager 上的 Fragment 时,它都会调用前一个 Fragment 上的 onPageChanged
方法,您可以在其中释放媒体播放器并执行任何其他操作你需要的。
关于android - 在滑动时释放 Android ViewPager 中的媒体播放器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43532459/