Como obtenho o fragmento exibido no momento?

444

Estou brincando com fragmentos no Android.

Eu sei que posso alterar um fragmento usando o seguinte código:

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();

Minha pergunta é, em um arquivo Java, como posso obter a instância do Fragment exibida no momento?

Leem.fin
fonte
1
Possível duplicata do objeto Get the fragment fragment atual
Sruit A.Suk 6/16

Respostas:

453

Ao adicionar o fragmento em sua transação, você deve usar uma tag.

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

... e mais tarde, se você quiser verificar se o fragmento está visível:

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

Consulte também http://developer.android.com/reference/android/app/Fragment.html

ramdroid
fonte
74
Ok, mas preciso de uma maneira de obter imediatamente a instância de fragmento exibida no momento, não verificar iterativamente todos os fragmentos e decidir qual fragmento será exibido na tela. Eu acho que a sua resposta precisa da minha código para verificar iteratively cada um dos meus fragmentos, e descobrir o visível ...
Leem.fin
33
Sim, mas pode haver mais de um fragmento visível por vez. Então, não há nada como o "único fragmento ativo" ....
RAMDroid
6
Ok, mesmo que haja vários fragmentos exibidos, eu ainda preciso de uma maneira de obtê-los ... e de uma maneira que seja melhor do que verificar iterativamente cada um dos meus fragmentos. Estou preocupação em "pegá-los" um método como getDisplayedFragment (), mas não tenho certeza que há tal método no Android
Leem.fin
2
Não sei por que isso é um problema para você ... Você geralmente tem apenas alguns fragmentos em uma atividade e não deve ser realmente um problema verificar se estão visíveis ou não.
RAMDroid
12
Por que todo mundo está votando esta resposta? Claro, é um bom código, mas não responde à pergunta para obter um fragmento específico por tag. MAS Asker deseja o fragmento exibido no momento, o que significa que ele não sabe qual fragmento é exibido. Sim, pode haver vários fragmentos, mas a leitura da pergunta infere que apenas 1 fragmento é exibido na interface do usuário .... Desculpe, tive que reduzir o voto porque ele não responde ao contexto da pergunta.
angryITguy
410

Eu sei que é um post antigo, mas também estava tendo problemas com ele anteriormente. Encontrei uma solução para fazer isso na onBackStackChanged()função de escuta

  @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();

    }

Isso funcionou para mim, pois não queria percorrer todos os fragmentos que tenho para encontrar um que seja visível. Espero que ajude outra pessoa também.

Sev
fonte
13
Exatamente o que eu procurava ao lidar com onBackPressed () após a rotação da tela com uma gaveta de navegação. Obrigado por voltar para compartilhar isso.
ShortFuse 27/08/14
1
O findFragmentById não repete todos os fragmentos internamente? :)
Andrew Senner
46
no caso de .getFragmentManagerrelatórios tipo incompatível, como aconteceu no meu caso, é porque eu estava usando o android.support.app.v4.Fragment, caso em que o método direito de uso égetSupportFragmentManager
Răzvan Barbu
3
ou você pode usar findFragmentByTag()no lugar de findFragmentById, se você tiver fornecido tag se fragmentar ao adicioná-lo afragmentManager.beginTransaction() .add(containerID, frag, fragmentTag) .addToBackStack(fragmentTag) .commit();
DeltaCap019
@AndrewSenner, ele quer dizer que ele não queria fazê-lo explicitamente :)
Farid
161

Aqui está minha solução que eu acho útil para cenários de baixo fragmento

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;
}
Matt Mombrea
fonte
13
fragmentpode ser nulo em certos cenários, como quando você abre a pilha traseira. Tão melhor uso if (fragment != null && fragment.isVisible()).
cprcrack
8
método incompleta porque é possível que haja não só um fragmento visível
letroll
Se nenhum fragmento estiver visível, fragmentManager.getFragments () retornará NULL, o que levará o NPE a dizer "Tentativa de chamar o método de interface 'java.util.Iterator java.util.List.iterator ()' em uma referência de objeto NULL". Portanto, o loop deve ser cercado por uma verificação simples: if (fragmentos! = Null)
Pranav Mahajan
E se mais de um fragmento estiver visível?
Shivaraj Patil
5
Tecnicamente, isso deve ser marcado como resposta com base na pergunta. O Asker deseja exibir fragmento atualmente, sem saber qual fragmento é. Outras respostas continuam recebendo fragmentos por tag
angryITguy 26/17
76

Toda vez que você mostra um fragmento, deve colocá-lo no backstack:

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

E então, quando você precisar obter o fragmento atual, poderá usar este método:

public BaseFragment getActiveFragment() {
    if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
        return null;
    }
    String tag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
    return (BaseFragment) getSupportFragmentManager().findFragmentByTag(tag);
}
Dmitry_L
fonte
4
Tenho certeza de que essa técnica não funcionará para fragmentos usados ​​com um ViewPager, pois eles não são adicionados por tag. Apenas jogando isso lá fora.
loeschg
3
Isso parece funcionar quando você liga addToBackStack(tag), mas e se você não quiser adicionar o fragmento à pilha de trás?
Cprcrack
1
Isso só funciona se a sua tag for igual ao nome da pilha traseira, o que parece incomum.
O que acontece se você adicionou 5 fragmentos na mesma transação?
Kevin Lam
Talvez seja bom dizer que, se você chamar addToBackStack (null) para algum fragmento em que você não precisa de um nome, o método getName () poderá retornar nulo e você obterá um NPE. @ dpk, docu diz: Obtenha o nome que foi fornecido para FragmentTransaction.addToBackStack (String) ao criar esta entrada. Além disso, adicione uma verificação nula se EntryCount for 0 e tentar receber a entrada superior.
precisa saber é o seguinte
23

O que estou usando para encontrar o fragmento de exibição atual está no código abaixo. É simples e funciona para mim agora. É executado na atividade que contém os fragmentos

    FragmentManager fragManager = this.getSupportFragmentManager();
    int count = this.getSupportFragmentManager().getBackStackEntryCount();
    Fragment frag = fragManager.getFragments().get(count>0?count-1:count);
tainy
fonte
3
Você deve verificar para ter certeza count> 0 para que get (count-1) não lançar uma IndexOutOfBoundsException
kehers
@tainy isso não dará o fragmento que foi substituído, mas não foi adicionado ao backstack. Se sim, posso obtê-lo usando o argumento tag?
Cafebabe1991 06/06
A chamada getFragments não fornecerá aos fragmentos a ordem em que foram adicionados após você chamar popBackStack (null, FragmentManager.POP_BACK_STACK_INCLUSIVE) e adicionar mais fragmentos.
Leho
se a atividade tiver mais de um fragmento visível, seu caminho está errado. Por exemplo: ViewPager com fragmentos. como I conhecido getBackStackEntryCount () número de devolução de Transação, não número de fragmento
HungNM2
Você deve verificar em fragManager.getFragments().size()vez de, getBackStackEntryCount()pois eles não são necessariamente iguais (que é o meu caso). Caso contrário, você pode travar com IndexOutOfBoundsException
RustamG
19

Maneira Kotlin;

val currentFragment = supportFragmentManager.fragments.last()
Cafer Mert Ceyhan
fonte
Funciona apenas na API 26 e superior
ibit 24/03/19
1
@ibit, o que você quer dizer com funciona apenas na API 26? Eu tentei no emulador API 19 funcionando bem.
precisa saber é o seguinte
@HendraWD você está correto! Eu estava me referindo à função na getFragments()função frameworks , que é API 26 e superior.
ibit 04/04/19
2
cuidar. Se antes você não tem nenhuma pilha de fragmentos, isso pode causar uma exceção vazia!
Jetwiz 18/11/19
Isso não funciona? java.lang.ClassCastException: androidx.navigation.fragment.NavHostFragment não pode ser transmitido para o fragmento
coolcool1994
13

A maneira reativa :

Observable.from(getSupportFragmentManager().getFragments())
    .filter(fragment -> fragment.isVisible())
    .subscribe(fragment1 -> {
        // Do something with it
    }, throwable1 -> {
        // 
    });
localhost
fonte
7
como isso é reativo? Você usa um observável mas só emitirá uma vez
Tim
6
E é apenas um exagero. Um simples avanço avançado faria o mesmo, talvez até mais rápido.
Peterstev Uremgba
usando fluxo de reativa para apenas api fluxo não é tão inteligente, de fato, como eles disseram que é um exagero usar o vapor Java8 api se você quiser tratar a lista como um fluxo e aplicar a api filtro
AndroidLover
13

Meu método é baseado em try / catch assim:

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

Mas pode haver uma maneira melhor ...

Thordax
fonte
1
Minha pergunta é como obter o fragmento atualmente exibido, o que significa que pode haver muitos fragmentos. Quero apenas obter a instância do atualmente exibido, por que usar (MyFragment) ?? Quero dizer, poderia ser qualquer exibição de fragmento na tela ... e quero obter a exibida no momento.
Leem.fin
MY_TAG_FRAGMENT é a tag do fragmento que criei antes de usar uma substituição, assim: fragmentTransaction.replace (R.id.FL_MyFragment, MyFragment, MY_TAG_FRAGMENT);
Thordax 15/02/12
Se eu tiver vários fragmentos, posso usar uma tag para todos os fragmentos quando chamar .replace (...)?
Leem.fin
Sim, não há problema, use este código: fragmentTransaction.replace (R.id.FL_MyFragment, MyFragment, MY_TAG_FRAGMENT); e pode correr bem.
Thordax 15/02/12
1
Bem, eu realmente não entendo seu ponto de vista, quero dizer que preciso de uma maneira de obter imediatamente a instância do Fragment exibida no momento, não verificar iterativamente todos os fragmentos e decidir qual fragmento será exibido na tela.
Leem.fin
11

Bem, essa pergunta teve muitas visualizações e atenção, mas ainda não continha a solução mais fácil do meu lado - usar getFragments ().

            List fragments = getSupportFragmentManager().getFragments();
            mCurrentFragment = fragments.get(fragments.size() - 1);
Nativ
fonte
1
Infelizmente, isso nem sempre é verdade; o getSupportFragmentManager().getFragments() retorna uma lista, mas que pode conter valores nulos, se o fragmento mais recente acabou de ser retirado do backstack. Eq: Se você verificar o seu caminho dentro do onBackStackChanged()método e ligar para popBackStack()algum lugar, então mCurrentFragmentserá null.
Stumi 15/02
@ Stumi Obrigado por esta informação. Sim, parece um dos muitos problemas estranhos no ciclo de vida do Android.
Nativ
9

Você pode consultar qual fragmento é carregado no seu quadro de conteúdo de Atividades e recuperar a classe de fragmento ou o 'nome simples' do fragmento (como uma sequência).

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

Uso:

Log.d(TAG, getCurrentFragment());

Saídas:

D/MainActivity: FragOne
Sr. L
fonte
8

É um pouco tarde, mas para quem estiver interessado: Se você conhece o índice do fragmento desejado no FragmentManager, obtenha uma referência a ele e verifique a função isMenuVisible ()! aqui :

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

Se trueé visível para o usuário e assim por diante!

MohammadReza
fonte
1
Curiosamente, esta foi a única solução listada aqui que funcionou para mim. Ao mesmo tempo, vários fragmentos podem ter isVisible() == true, getView() != null. Além disso, no meu código getBackStackEntryCounté sempre zero. Mesmo que eu não use menus, isMenuVisible()até agora é o único discriminante que parece apontar de maneira confiável para o fragmento atualmente "ativo". ty
parvus
7

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
}
Nam Ngo Thanh
fonte
6

Se chegar aqui e você estiver usando o Kotlin:

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

R.id.fragment_containeré o local idonde fragmentestá apresentando em seuactivity

Ou se você deseja uma solução melhor:

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

    if (it is FooFragment) {
        // The presented fragment is FooFragment type
    }
}
pableiros
fonte
5

Inspirado pela resposta de Tainy , aqui estão meus dois centavos. Pouco modificado da maioria das outras implementações.

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

Substitua "myActivity"por "this" se for sua atividade atual ou use referência a sua atividade.

Nashe
fonte
5

Há um método chamado findFragmentById()no SupportFragmentManager. Eu o uso no contêiner de atividades como:

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

É assim que você se atualiza Fragment. Se você tem um costume Fragmente precisa verificar o Fragmentque é, normalmente uso instanceof:

if (currentFragment() instanceof MyFrag){
    // Do something here
}
Kevin Murvie
fonte
5

Se você estiver usando o AndroidX Navigation:

val currentFragment = findNavController(R.id.your_navhost).?currentDestination

Para mais informações sobre este componente de navegação: https://developer.android.com/guide/navigation/navigation-getting-started

Cory Roy
fonte
Isso não compila
IgorGanapolsky 17/04
1
Ele só seria compilado se você tivesse configurado corretamente a navegação AndroidX e de alguma forma chamado seu navHost your_navhost.
Cory Roy
4

Esta é uma maneira simples de obter o fragmento atual.

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);
    }
  }
});
lallu Sukendh
fonte
4

A resposta de Sev funciona quando você pressiona o botão Voltar ou altera o backstack.

Eu fiz algo um pouco diferente, no entanto. Eu tenho uma configuração de ouvinte de alteração de backstack em um fragmento base e seus fragmentos derivados e esse código está no ouvinte:

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
}
MCLLC
fonte
3

Isso é trabalho para mim. Espero que isso ajude alguém.

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

Se você estiver obtendo a instância atual do Fragment da atividade pai, poderá apenas

findFragmentByID(R.id.container);

Na verdade, essa é a instância atual do fragmento que é preenchida na exibição. Eu tive o mesmo problema. Eu tive que carregar o mesmo fragmento duas vezes, mantendo um no backstack.

O método a seguir não funciona. Apenas obtém um fragmento com a etiqueta. Não perca seu tempo com esse método. Estou certo de que tem seus usos, mas obter a versão mais recente do mesmo fragmento não é um deles.

findFragmentByTag()
Yasin Yaqoobi
fonte
3

Finalize esta solução. Funcionou para mim obter o fragmento atual.

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");
        }
Haroon khan
fonte
2
final FragmentManager fm=this.getSupportFragmentManager();
final Fragment fragment=fm.findFragmentByTag("MY_FRAGMENT");

if(fragment != null && fragment.isVisible()){
      Log.i("TAG","my fragment is visible");
}
else{
      Log.i("TAG","my fragment is not visible");
}
KeranMarinov
fonte
Isso funciona com o Jetpack?
IgorGanapolsky 17/04
2
getSupportFragmentManager().findFragmentById(R.id.content_frame).getClass().getSimpleName();

Bem, acho que essa é a resposta mais direta a essa pergunta. Eu espero que isso ajude.

Abhishek
fonte
2

Aqui está uma solução Kotlin:

if ( this.getSupportFragmentManager().getBackStackEntryCount()>0 ) {
    var fgmt = this.getSupportFragmentManager().fragments[this.getSupportFragmentManager().getBackStackEntryCount()-1]
    if( fgmt is FgmtClassName ) {
        (fgmt as FgmtClassName).doSth()
    }
}

Maneira simplificada:

with ( this.getSupportFragmentManager() ) {
    if ( getBackStackEntryCount()>0 ) {
        var fgmt = fragments[getBackStackEntryCount()-1]
        if ( fgmt is FgmtClassName ) {
            (fgmt as FgmtClassName).doSth()
        }
    }
}
anamkin
fonte
2

Maneira fácil de fazer isso:

Fragment fr=getSupportFragmentManager().findFragmentById(R.id.fragment_container);
String fragmentName = fr.getClass().getSimpleName();
Biplob Das
fonte
1

Na atividade principal, o método onAttachFragment (fragmento de fragmento) é chamado quando um novo fragmento é anexado à atividade. Nesse método, você pode obter a instância do fragmento atual. No entanto, o método onAttachFragment não é chamado quando um fragmento é retirado do backstack, ou seja, quando o botão Voltar é pressionado para colocar o fragmento superior no topo da pilha. Ainda estou procurando um método de retorno de chamada que é acionado na atividade principal quando um fragmento se torna visível dentro da atividade.

ufdeveloper
fonte
tão perto! :-)
Blundell
Usamos a biblioteca de Navegação Jetpack
IgorGanapolsky
1

No caso de fragmentos rolados, quando sua instância de uso da classe ViewPager, suponha mVeiwPager, você pode chamar mViewPager.getCurrentItem () para obter o número int do fragmento atual.

em MainLayout.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical"
    tools:context="unidesign.photo360.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="false"
        android:theme="@style/AppTheme.AppBarOverlay"
        app:expanded="false">

        <android.support.v7.widget.Toolbar
            android:id="@+id/main_activity_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            app:title="@string/app_name">

        </android.support.v7.widget.Toolbar>

    </android.support.design.widget.AppBarLayout>


    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </android.support.v4.view.ViewPager>
    
</android.support.design.widget.CoordinatorLayout>

em MainActivity.kt

class MainActivity : AppCompatActivity() {
    
        lateinit var mViewPager: ViewPager
        lateinit var pageAdapter: PageAdapter
        
//      ...
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            
            pageAdapter = PageAdapter(supportFragmentManager)
            mViewPager = findViewById(R.id.view_pager)
//          ...
            }
            
        override fun onResume() {
          super.onResume()
          var currentFragment = pageAdapter.getItem(mViewPager.currentItem)
//         ...
          }

Andrei Radchenko
fonte
1

Eu achei findFragmentByTagque não é tão conveniente. Se você possui um dos String currentFragmentTagseus Activitypais Fragment, é necessário salvá-lo onSaveInstanceStatee restaurá-lo onCreate. Mesmo se você fizer isso, quando o Activityrecriado onAttachFragmentfor chamado antes onCreate, você não poderá usá currentFragmentTag-lo onAttachFragment(por exemplo, atualizar algumas visualizações com base em currentFragmentTag), porque talvez ainda não seja restaurado.

Eu uso o seguinte código:

Fragment getCurrentFragment() {
    List<Fragment> fragments = getSupportFragmentManager().getFragments();
    if(fragments.isEmpty()) {
        return null;
    }
    return fragments.get(fragments.size()-1);
}

O documento de FragmentManagerestado que

A ordem dos fragmentos na lista é a ordem em que foram adicionados ou anexados.

Quando você precisar fazer coisas com base no tipo de fragmento atual, use em getCurrentFragment() instance of MyFragmentvez de currentFragmentTag.equals("my_fragment_tag").

Observe que getCurrentFragment()in onAttachFragmentnão receberá o anexo Fragment, mas o anterior anexado.

Jeffrey Chen
fonte
1

Eu tive que fazer isso muito recentemente e nenhuma das respostas aqui realmente se adequava a esse cenário.

Se você tem certeza de que apenas um fragmento será visível (tela cheia), realmente deseja encontrar o que está no topo do backstack. Por exemplo, como umKotlin para Fragment:

import androidx.fragment.app.Fragment

fun Fragment.setVisibilityChangeListener(clazz: Class<out Fragment>, listener: (Boolean) -> Unit) {
    fragmentManager?.run {
        addOnBackStackChangedListener {
            val topFragmentTag = getBackStackEntryAt(backStackEntryCount - 1).name
            val topFragment = findFragmentByTag(topFragmentTag)
            listener(topFragment != null && topFragment::class.java == clazz)
        }
    }
}

E use-o como:

class MyFragment: Fragment {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        setVisibilityChangeListener(this::class.java) { visible -> 
            // Do stuff
        }
    }
}
Mikel Pascual
fonte
1

Você pode fazer isso com muita facilidade também com uma URL no logcat que o redirecionará para o código-fonte do código-fonte atual do fragmento. Primeiro, você precisa adicionar um OnBackStackChangedListener na atividade do host, como -

activity.getChildFragmentManager().addOnBackStackChangedListener(backStackListener);

E a implementação OnBackStackChangedListener é -

    public FragmentManager.OnBackStackChangedListener backStackListener = () -> {

    String simpleName = "";
    String stackName = getStackTopName().trim();

    if (Validator.isValid(stackName) && stackName.length() > 0) {

      simpleName = stackName.substring(Objects.requireNonNull(stackName).lastIndexOf('.') + 1).trim();

      List<Fragment >
       fragmentList = getChildFragmentManager().getFragments();
      Fragment myCurrentFragment;

      for (int i = 0; i < fragmentList.size(); i++) {
       myCurrentFragment= fragmentList.get(i);
       if (myCurrentFragment.getClass().getSimpleName().equals(simpleName)) {
        //Now you get the current displaying fragment assigned in myCurrentFragment.
        break;
       }
       myFragment = null;
      }
     }


     //The code below is for the source code redirectable logcat which would be optional for you.
     StackTraceElement stackTraceElement = new StackTraceElement(simpleName, "", simpleName + ".java", 50);
     String fileName = stackTraceElement.getFileName();
     if (fileName == null) fileName = "";
     final String info = "Current Fragment is:" + "(" + fileName + ":" +
     stackTraceElement.getLineNumber() + ")";
     Log.d("now", info + "\n\n");
    };

E o método getStackTopName () é -

public String getStackTopName() {
    FragmentManager.BackStackEntry backEntry = null;
    FragmentManager fragmentManager = getChildFragmentManager();
    if (fragmentManager != null) {
        if (getChildFragmentManager().getBackStackEntryCount() > 0)
            backEntry = getChildFragmentManager().getBackStackEntryAt(
                    getChildFragmentManager().getBackStackEntryCount() - 1
            );
    }
    return backEntry != null ? backEntry.getName() : null;
}
Gk Mohammad Emon
fonte