1

KONTEXT: Ich habe eine Aktivität, 4 Fragmente und ein ViewPager (jede Seite besteht aus einem Fragment). Jedes Fragment enthält eine Liste von kurzen Tönen (jeweils max. 5 Sekunden). Das erwartete Verhalten ist: Wenn der Benutzer auf einen Sound auf einer bestimmten Seite klickt und der Sound nicht abgespielt wird, wird der Media Player freigegeben, wenn der Benutzer zu einer anderen Seite wischt, wodurch der Sound nicht mehr abgespielt wird.Freigabe Media Player in Android ViewPager auf Swipe

PROBLEM: Wenn nach links oder rechts beim Streichen, das Verfahren onPause oder OnStop nicht aufgerufen werden (da die viewPager definitions lädt der aktuellen, die vorherige und die nächste Seite), so dass der Media Player den Ton von den Spielen Die letzte Seite hört beim Wischen nicht auf.

RESEARCH: ich eine Menge auf mehr Beiträgen gesucht habe, im Zusammenhang mit onPageChangeListener, setOffScreenPageLimit, Set Mediaplayer nicht in Fragmente, sondern in der Aktivität (nicht in meinem Fall, da ich Listen von Klängen mit Adapter). Hier sind einige Links, die ich recherchiert, aber nicht lösen mein Problem: 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

VORSCHLÄGE?: Wenn Sie Vorschläge haben, wie Sie dieses Problem angehen können, wäre es sehr geschätzt! Vielen Dank!

Antwort

0

Betrachten Sie das Fragment selbst als OnPageChangeListener. Dann können Sie den Listener beim Anhängen der Seite festlegen. Dadurch können Sie die Seitenänderungsinformationen an das Fragment übergeben. Sie dürfen mehr als eine OnPageChangeListener haben. Ich hoffe, das hilft.

EDIT:

Betrachten Sie so etwas wie dieses.

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

Sie sagen "Sie können den Hörer einstellen, wenn Sie die Seite anhängen", aber alle meine 4 Seiten (die 4 Fragmente) werden über einen Adapter hinzugefügt. Können Sie bitte ein Code-Snippet zur Klärung Ihres Vorschlags anbieten? –

+0

Leider funktioniert es nicht. Ich habe '' 'implementiert ViewPager.OnPageChangeListener''' in Fragmenten, aber die Methoden werden nicht ausgelöst ... –

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

globale Variable

Ich bin immer gleiche Problem. Ich habe zwei Methoden spielen und im Fragment anhalten. und rufen Sie unter Code in 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, der obige Code löste Ihr Problem? oder indem Sie es verwenden, stehen Sie immer noch dem Problem gegenüber? –

+0

Mein Problem ist gelöst. Ich spiele Video im Fragment von ViewPager. –

+0

Ich habe ViewPager in Fragment verwendet. Wenn Sie ViewPager innerhalb von activty verwenden, verwenden Sie getSupportFragmentManaager, das von getChildFragmentManager installiert wurde. –

1

Sie können eine Callback-Schnittstelle auf Ihrem MainActivity mit einem Verfahren onPageChanged() wie folgt erstellen:

public interface Callback { 
    void onPageChanged(); 
} 

Dann können Sie diese OnPageChangeListener verwenden:

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) { 
    } 
}); 

Jedes Fragment in Ihrem ViewPager kann so erstellt werden:

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 
    } 
} 

Danach tun, jedes Mal, wenn Sie das Fragment auf dem ViewPager ändern wird es die onPageChanged Methode auf dem vorherigen Fragmente anrufen, und dort können Sie Ihren Media Player freigeben und andere Operation tun, die Sie benötigen.