Как получить отображаемый фрагмент? - 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 ]

7 голосов
/ 27 мая 2018

Вы можете запросить, какой фрагмент загружен в ваш фрейм контента «Деятельности», и извлечь класс фрагмента или фрагмент «простое имя» (в виде строки).

public String getCurrentFragment(){
     return activity.getSupportFragmentManager().findFragmentById(R.id.content_frame).getClass().getSimpleName();
}

Использование:

Log.d(TAG, getCurrentFragment());

Выходы:

D/MainActivity: FragOne
5 голосов
/ 10 марта 2017

В SupportFragmentManager есть метод с именем findFragmentById(). Я использую его в контейнере активности, как:

public Fragment currentFragment(){
    return getSupportFragmentManager().findFragmentById(R.id.activity_newsfeed_frame);
}

Вот как получить ваш текущий Fragment. Если у вас есть пользовательский Fragment и вам нужно проверить, что это за Fragment, я обычно использую instanceof:

if (currentFragment() instanceof MyFrag){
    // Do something here
}
5 голосов
/ 22 февраля 2019

Путь Котлина;

val currentFragment = supportFragmentManager.fragments.last()
5 голосов
/ 14 июня 2016

Вдохновленный ответом Tainy , вот мои два цента.Немного изменен по сравнению с большинством других реализаций.

private Fragment getCurrentFragment() {
    FragmentManager fragmentManager = myActivity.getSupportFragmentManager();
    int stackCount = fragmentManager.getBackStackEntryCount();
    if( fragmentManager.getFragments() != null ) return fragmentManager.getFragments().get( stackCount > 0 ? stackCount-1 : stackCount );
    else return null;
}

Замените "myActivity" на "this", если это ваша текущая деятельность или используйте ссылку на вашу деятельность.

4 голосов
/ 08 сентября 2017

Это простой способ получить текущий фрагмент ..

getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
  @Override public void onBackStackChanged() {
    currentFragment = fragmentManager.findFragmentById(R.id.content);
    if (currentFragment !=  null && (currentFragment instanceof LoginScreenFragment)) {
      logout.setVisibility(View.GONE);
    } else {
      logout.setVisibility(View.VISIBLE);
    }
  }
});
4 голосов
/ 13 ноября 2018

Если попасть сюда и вы используете Kotlin:

var fragment = supportFragmentManager.findFragmentById(R.id.fragment_container)

R.id.fragment_container - это id, где fragment присутствует на их activity

Или, если вы хотите более удачное решение:

supportFragmentManager.findFragmentById(R.id.content_main)?.let {
    // the fragment exists

    if (it is FooFragment) {
        // The presented fragment is FooFragment type
    }
}
4 голосов
/ 12 июня 2015

Ответ Сева работает, когда вы нажимаете кнопку «Назад» или иным образом меняете бэкстек.

Я сделал что-то немного другое, хотя. У меня есть настройка прослушивателя изменений backstack на базовом фрагменте и его производных фрагментах, и этот код находится в прослушивателе:

Fragment f = getActivity().getSupportFragmentManager().findFragmentById(R.id.container);

if (f.getClass().equals(getClass())) {
    // On back button, or popBackStack(),
    // the fragment that's becoming visible executes here,
    // but not the one being popped, or others on the back stack

    // So, for my case, I can change action bar bg color per fragment
}
3 голосов
/ 30 октября 2015

Если вы получаете текущий экземпляр Fragment от родительского действия, вы можете просто

findFragmentByID(R.id.container);

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

Следующий метод не работает.Он просто получает фрагмент с тегом.Не тратьте свое время на этот метод.Я уверен, что он использует его, но получить последнюю версию того же фрагмента не один из них.

findFragmentByTag()
3 голосов
/ 27 сентября 2018

Оформить заказ на это решение. Это помогло мне получить текущий фрагмент.

if(getSupportFragmentManager().getBackStackEntryCount() > 0){
        android.support.v4.app.Fragment f = 
         getSupportFragmentManager().findFragmentById(R.id.fragment_container);
        if(f instanceof ProfileFragment){
            Log.d(TAG, "Profile Fragment");
        }else if(f instanceof SavedLocationsFragment){
            Log.d(TAG, "SavedLocations Fragment");
        }else if(f instanceof AddLocationFragment){
            Log.d(TAG, "Add Locations Fragment");
        }
3 голосов
/ 16 декабря 2014

Это работа для меня.Я надеюсь, что это кого-то поможет.

FragmentManager fragmentManager = this.getSupportFragmentManager();  
        String tag = fragmentManager
                    .getBackStackEntryAt(
                    fragmentManager
                    .getBackStackEntryCount() - 1)
                    .getName();
              Log.d("This is your Top Fragment name: ", ""+tag);
...