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方法,並在那裏你可以釋放你的媒體播放器,並做到這一點,你需要任何其他操作的時間。