0

In meinem MainActivity mit ActionBar höre ich einen Zuhörer von einem DialogFragment und basiert auf dem Fragment von ActionBar ich bin, ich brauche ein paar Dinge zu tun.Beide Fragment in ActionBar true zurück für fragment.isVisible()

ich Code unten bin mit dem aktuellen Fragment zu erhalten und zu prüfen, welche der beiden ActionBar Fragment ich bin auf:

private Fragment getVisibleFragment() { 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    List<Fragment> fragments = fragmentManager.getFragments(); 
    if (fragments != null) { 
     for (Fragment fragment : fragments) { 
      if (fragment != null && fragment.isVisible()) 
       return fragment; 
     } 
    } 
    return null; 
} 

aber fragment.isVisible() kehrt gilt sowohl für die Fragmente. Warum sollte das sein? Gibt es eine andere Flagge, die ich berücksichtigen muss?

Unten ist mein FragmentPagerAdapter implentation:

public class SectionsPagerAdapter extends FragmentPagerAdapter { 
Context context; 
public SectionsPagerAdapter(FragmentManager fm, Context context) { 
    super(fm); 
    this.context = context; 
} 

@Override 
public Fragment getItem(int index) { 
    switch (index) { 
     case 0: 
      return new ReceivedListFragment(); 
     case 1: 
      return new SentListFragment(); 
    } 
    return null; 
} 

@Override 
public int getCount() { 
    // Show 2 total pages. 
    return 2; 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    Locale l = Locale.getDefault(); 
    switch (position) { 
     case 0: 
      return context.getString(R.string.title_section1).toUpperCase(l); 
     case 1: 
      return context.getString(R.string.title_section2).toUpperCase(l); 
    } 
    return null; 
} 
} 
+0

Wie fügen Sie Ihre Fragmente hinzu? Können Sie den Teil anzeigen, in dem Sie die Fragmenttransaktion ausführen? – jonDoe

+0

@jonDoe hat es dem Code hinzugefügt. – user1324887

Antwort

1

Es scheint, dass Sie eine ViewPager verwenden, und Sie müssen herausfinden, welche die aktuell gewählte Ansicht ist. Das Problem in Ihrem Ansatz ist meiner Meinung nach, dass der Viewpager eine Instanz von mindestens zwei Fragmenten enthält. Es scheint, dass Sie nur zwei Fragmente haben, beide Fragmente werden vom Viewpager aufbewahrt und deshalb erhalten Sie die isVisible für beide Fragmente.

Wenn Ihr nur Notwendigkeit, die aktuell ausgewählte Fragment auf dem viewpager zu bekommen, ist, versuchen Sie diese Methode aus der viewpager Klasse:

mViewPagerInstance.getCurrentItem(); 

mit dem Sie die aktuell ausgewählte Index Fragment geben.

andere Möglichkeit, ein PageChangeListener für Ihre viewpager hinzuzufügen wäre und dann auf Seite Änderungsereignisse zu hören:

class MyActivity extends Activity{ 
    private int curPage; 

    private static class MFragChangeListener extends SimpleOnPageChangeListener{ 
     public void onPageSelected(int position) { 
       curPage = position; 
    } 
} 

    ........... /* Rest of your code */ 

mViewPagerInstance.setOnPageChangeListener(new MFragChangeListener()); 
/* Now access curPage to get the current selected page index whenever you need it. */ 

verweisen auf this SO auch posten.

+0

das funktioniert. Ich hatte ein Backup im Kopf: 'private Fragment getVisibleFragment (Klasse fragmentType) {... if (fragment! = Null && fragment.isVisible() && fragmentType == ReceivedListFragment.class) {return fragment; } ...} 'aber ich wollte eine richtige Lösung. Danke – user1324887

+0

Ja, wir sollten immer die beste Lösung verwenden, wann immer es möglich ist. Hacks können in unerwarteten Situationen versagen und wir werden uns dann die Köpfe brechen. Ich bin froh, dass das für dich funktioniert hat! – jonDoe

+0

Wie kann ich jetzt die Instanz von Fragment erhalten? So etwas wie 'mSectionsPagerAdapter.getItem (currentFragmentIndex)' gibt eine neue Instanz des Fragments zurück – user1324887