Как получить отображаемый фрагмент? - PullRequest
395 голосов
/ 15 февраля 2012

Я играю с фрагментами в Android.

Я знаю, что могу изменить фрагмент, используя следующий код:

FragmentManager fragMgr = getSupportFragmentManager();
FragmentTransaction fragTrans = fragMgr.beginTransaction();

MyFragment myFragment = new MyFragment(); //my custom fragment

fragTrans.replace(android.R.id.content, myFragment);
fragTrans.addToBackStack(null);
fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragTrans.commit();

У меня вопрос в файле Java, как я могу получить отображаемый в данный момент экземпляр фрагмента?

Ответы [ 41 ]

424 голосов
/ 15 февраля 2012

Когда вы добавляете фрагмент в свою транзакцию, вы должны использовать тег.

fragTrans.replace(android.R.id.content, myFragment, "MY_FRAGMENT");

... и позже, если вы хотите проверить, виден ли фрагмент:

MyFragment myFragment = (MyFragment)getFragmentManager().findFragmentByTag("MY_FRAGMENT");
if (myFragment != null && myFragment.isVisible()) {
   // add your code here
}

Смотрите также http://developer.android.com/reference/android/app/Fragment.html

370 голосов
/ 05 июля 2014

Я знаю, что это старый пост, но раньше у него тоже были проблемы.Нашел решение, которое должно было сделать это в onBackStackChanged() функции прослушивания

  @Override
    public void onBackPressed() {
        super.onBackPressed();

         Fragment f = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
      if(f instanceof CustomFragmentClass) 
        // do something with f
        ((CustomFragmentClass) f).doSomething();

    }

. Это сработало для меня, так как я не хотел перебирать каждый фрагмент, который мне нужно, чтобы найти тот, который видим.Надеюсь, это поможет кому-то еще.

140 голосов
/ 11 октября 2013

Вот мое решение, которое я считаю полезным для сценариев с малыми фрагментами

public Fragment getVisibleFragment(){
    FragmentManager fragmentManager = MainActivity.this.getSupportFragmentManager();
    List<Fragment> fragments = fragmentManager.getFragments();
    if(fragments != null){
        for(Fragment fragment : fragments){
            if(fragment != null && fragment.isVisible())
                return fragment;
        }
    }
    return null;
}
75 голосов
/ 21 марта 2013

Каждый раз, когда вы показываете фрагмент, вы должны поместить его тег в backstack:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_ENTER_MASK);       
ft.add(R.id.primaryLayout, fragment, tag);
ft.addToBackStack(tag);
ft.commit();        

А затем, когда вам нужно получить текущий фрагмент, вы можете использовать этот метод:

public BaseFragment getActiveFragment() {
    if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
        return null;
    }
    String tag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
    return (BaseFragment) getSupportFragmentManager().findFragmentByTag(tag);
}
21 голосов
/ 09 июня 2014

То, что я использую для поиска текущего отображаемого фрагмента, приведено ниже.Это просто и у меня работает.Он работает в деятельности, которая содержит фрагменты

    FragmentManager fragManager = this.getSupportFragmentManager();
    int count = this.getSupportFragmentManager().getBackStackEntryCount();
    Fragment frag = fragManager.getFragments().get(count>0?count-1:count);
14 голосов
/ 26 апреля 2016

реактивный способ:

Observable.from(getSupportFragmentManager().getFragments())
    .filter(fragment -> fragment.isVisible())
    .subscribe(fragment1 -> {
        // Do something with it
    }, throwable1 -> {
        // 
    });
11 голосов
/ 15 февраля 2012

Мой метод основан на попытке / ловле, например:

MyFragment viewer = null;
    if(getFragmentManager().findFragmentByTag(MY_TAG_FRAGMENT) instanceOf MyFragment){
    viewer = (MyFragment) getFragmentManager().findFragmentByTag(MY_TAG_FRAGMENT);
}

Но может быть и лучший способ ...

8 голосов
/ 16 мая 2016

Ну, этот вопрос получил много взглядов и внимания, но все же не содержал самое простое с моей стороны решение - использовать getFragments ().

            List fragments = getSupportFragmentManager().getFragments();
            mCurrentFragment = fragments.get(fragments.size() - 1);
7 голосов
/ 27 июня 2014

Уже немного поздно, но для всех, кому интересно: Если вы знаете индекс нужного вам фрагмента в FragmentManager, просто получите ссылку на него и проверьте функцию isMenuVisible ()! здесь:

getSupportFragmentManager().getFragments().get(0).isMenuVisible()

Если true Его видно пользователю и т. Д.

7 голосов
/ 09 декабря 2015

1)

ft.replace(R.id.content_frame, fragment, **tag**).commit();

2)

FragmentManager fragmentManager = getSupportFragmentManager();
Fragment currentFragment = fragmentManager.findFragmentById(R.id.content_frame);

3)

if (currentFragment.getTag().equals(**"Fragment_Main"**))
{
 //Do something
}
else
if (currentFragment.getTag().equals(**"Fragment_DM"**))
{
//Do something
}
...