android - 在滑动时释放 Android ViewPager 中的媒体播放器

标签 android android-fragments android-viewpager android-mediaplayer

背景: 我有一个 Activity 、4 个 fragment 和一个 viewPager(每个页面由一个 fragment 组成)。每个 fragment 包含一个短声音列表(每个最长 5 秒)。预期的行为是:如果用户在某个页面上点击了一个声音并且声音没有播放完,如果用户滑动到另一个页面,媒体播放器将被释放,声音将停止播放。

问题: 向左或向右滑动时,不会调用 onPause 或 onStop 方法(因为根据定义 viewPager 会加载当前页面、上一页和下一页),因此播放上一页声音的媒体播放器不会在滑动时停止。

研究: 我在多个帖子上搜索了很多,与 onPageChangeListenersetOffScreenPageLimit、设置 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/

相关文章:

android - 如何在 AppWidget 中重置 RemoteView 的 ColorFilter

android - setText 无法在 TextView 中将数字显示为文本

android - 强制用户在对话框中选择选项

java - Android:用下面的内容填满整个屏幕的框

java - 将额外内容放入 bundle 中会导致奇怪的冲突和应用程序崩溃......为什么?

android - 无法解析 fragment 中的 findViewById

android - Google Play APK 无法安装在 Android Emulator API 25 上

java - 二进制 XML 文件行 #29 : Binary XML file line #29: Error inflating class fragment

android - 如何获取 ViewPager 当前 View ,这是在 onPageSelected 中向用户显示的 View

Android - 自定义 ViewPager 动画