1

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

问题: 左右滑动时,该方法的onPause或的onStop不叫(因为viewPager定义加载当前,以前和下页),因此,媒体播放器播放从声音最后一页不会停止滑动。

研究: 我已经搜索了很多关于多个职位,涉及到onPageChangeListenersetOffScreenPageLimit,设定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

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

回答

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); 
     .... 

    } 
} 
+0

你说“你可以在你附加页面时设置监听器”,但是我所有的4个页面(4个片段)都是通过一个适配器添加的。你能否提供一段代码片段来澄清你的建议? –

+0

不幸的是它不起作用。我用''实现ViewPager.OnPageChangeListener'''中的片段,但方法没有触发... –

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(); 
+0

Dheerubhai Bansal,上面的代码解决了你的问题?或通过使用它,你仍然面临着这个问题? –

+0

我的问题解决了。我在ViewPager的片段中播放视频。 –

+0

我在片段中使用了ViewPager。如果您在活动中使用ViewPager,请使用getChildFragmentManager中的getSupportFragmentManaager。 –

1

您可以在MainActivity创建一个Callback接口与方法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将调用以前的片段onPageChanged方法,并在那里你可以释放你的媒体播放器,并做到这一点,你需要任何其他操作的时间。