背景: 我有一个活动,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 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
建议?:如果您对如何解决此问题有任何建议,我们将不胜感激!谢谢!
答案 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();