在刷卡中释放Android ViewPager中的媒体播放器

时间:2017-04-21 01:32:41

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

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

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

研究: 我在与protected void module_Changed(object sender, EventArgs e) { // Retrieve the check box ModuleId value to add to SELECT query string moduleid = ((CheckBox)sender).ToolTip; } onPageChangeListener相关的多个帖子上进行了大量搜索,将MediaPlayer设置为不在片段中但在活动中(在我的情况下不可能,因为我有适配器的声音列表)。以下是我研究但未解决问题的一些链接:ViewPager swipe previous soundMultiple video players in viewpager in androidAndroid MediaPlayer on ViewPager blocking UI transition and no callback for initial page loadsHow to handle MediaPlayer object inside a fragment inside view pagerUsing Viewpager with MediaPlayer

建议?:如果您对如何解决此问题有任何建议,我们将不胜感激!谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用Callback这样的方法在MainActivity上创建onPageChanged()界面:

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中的每个片段都可以像这样创建:

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方法,并在那里释放您的媒体播放器并执行您需要的任何其他操作

答案 1 :(得分:0)

考虑将片段本身设为OnPageChangeListener。然后,您可以在附加页面时设置侦听器。这将允许您将页面更改信息传递给片段。您可以拥有多个OnPageChangeListener。希望有所帮助。

编辑:

考虑这样的事情。

public class PageFragment extends Fragment implements ViewPager.OnPageChangeListener {
    ViewPager pager;

    public void onPageScrollStateChanged (int state){
         // reset the player if needed. you can do this since player object is in this class
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        ....
        pager = (ViewPager) getActivity().findViewById(ViewPagerId);
        pager.addOnPageChangeListener(this);
        ....
    }
    @Override
    public void onDestroyView (){
        ....
        pager.removeOnPageChangeListener(this);
        ....

    }
}

答案 2 :(得分:0)

private int currentPos = 0;
private int prevPos = -1;

全局变量

我遇到了同样的问题。我已经采取两种方法播放并停止片段。并在onPageSelected(int position)

中调用以下代码
new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        prevPos = currentPos;
                        currentPos = position;
                        MyFragment fragment = (MainFragment) getChildFragmentManager().
                                findFragmentByTag("android:switcher:" + R.id.viewPagerVideo + ":" + prevPos);
                        if (fragment != null) {
                            fragment.stop();
                        }
                        fragment = (MyFragment) getChildFragmentManager().
                                findFragmentByTag("android:switcher:" + R.id.viewPager + ":" + currentPos);
                        if (fragment != null) {
                            fragment.play(mListUrl.get(position));
                        }
                    }
                });
            } catch (Exception ignore) {
            }
        }
    }).start();