Obtener el objeto fragmento actual

En mi main.xml tengo

     

Y estoy configurando un fragmento de objeto como este

 FragmentManager fragmentManager = activity.getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); Fragment newFragment = new FragmentType1(); fragmentTransaction.replace(R.id.frameTitle, casinodetailFragment, "fragmentTag"); // fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); 

Está configurando diferentes tipos de objetos Fragment ( FragmentType2,FragmentType3,... ) en diferentes momentos. Ahora, en algún punto del tiempo, necesito identificar qué objeto hay actualmente allí.

En resumen , necesito hacer algo como esto:

 Fragment currentFragment = //what is the way to get current fragment object in FrameLayout R.id.frameTitle 

Intenté lo siguiente

 TitleFragment titleFragmentById = (TitleFragment) fragmentManager.findFragmentById(R.id.frameTitle); 

y

  TitleFragment titleFragmentByTag = (TitleFragment) fragmentManager.findFragmentByTag("fragmentTag"); 

Pero ambos objetos (titleFragmentById y titleFragmentByTag) son null
¿Me he perdido algo?
Estoy usando el Compatibility Package, r3 y desarrollo para API level 7 .

findFragmentById() y findFragmentByTag() funcionarán si hemos configurado un fragmento usando fragmentTransaction.replace o fragmentTransaction.add , pero return null si hemos establecido el objeto en xml (como lo que he hecho en mi main.xml ). Creo que me falta algo en mis archivos XML.

Ahora, en algún punto del tiempo, necesito identificar qué objeto hay actualmente

Llame a findFragmentById() en FragmentManager y determine qué fragmento está en su contenedor R.id.frameTitle .

Prueba esto,

 Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container); 

esto te dará el fragmento actual, luego puedes compararlo con la clase de fragmento y hacer tus cosas.

  if (currentFragment instanceof NameOfYourFragmentClass) { Log.v(TAG, "find the current fragment"); } 

Creo que puedes usar el evento onAttachFragment que puede ser útil para detectar qué fragmento está activo.

 @Override public void onAttachFragment(Fragment fragment) { // TODO Auto-generated method stub super.onAttachFragment(fragment); Toast.makeText(getApplicationContext(), String.valueOf(fragment.getId()), Toast.LENGTH_SHORT).show(); } 

Creo que deberías hacer:

 Fragment currentFragment = fragmentManager.findFragmentByTag("fragmentTag"); 

La razón es porque estableces la etiqueta “fragmentTag” en el último fragmento que agregaste (cuando llamaste para reemplazar).

Esta es la solución más simple y funciona para mí.

1.) agregas tu fragmento

 ft.replace(R.id.container_layout, fragment_name, "fragment_tag").commit(); 

2.)

 FragmentManager fragmentManager = getSupportFragmentManager(); Fragment currentFragment = fragmentManager.findFragmentById(R.id.container_layout); if(currentFragment.getTag().equals("fragment_tag")) { //Do something } else { //Do something } 

Puede ser tarde, pero espero que ayude a otra persona, también @CommonsWare ha publicado la respuesta correcta.

 FragmentManager fm = getSupportFragmentManager(); Fragment fragment_byID = fm.findFragmentById(R.id.fragment_id); //OR Fragment fragment_byTag = fm.findFragmentByTag("fragment_tag"); 

Puede obtener la lista de los fragmentos y buscar la última.

  FragmentManager fm = getSupportFragmentManager(); List fragments = fm.getFragments(); Fragment lastFragment = fragments.get(fragments.size() - 1); 

Pero a veces (cuando navega hacia atrás) el tamaño de la lista permanece igual, pero algunos de los últimos elementos son nulos. Entonces, en la lista, repetí el último fragmento no nulo y lo usé.

  FragmentManager fm = getSupportFragmentManager(); if (fm != null) { List fragments = fm.getFragments(); for(int i = fragments.size() - 1; i >= 0; i--){ Fragment fragment = fragments.get(i); if(fragment != null) { // found the current fragment // if you want to check for specific fragment class if(fragment instanceof YourFragmentClass) { // do something } break; } } } 

Quizás la forma más simple es:

 public MyFragment getVisibleFragment(){ FragmentManager fragmentManager = MainActivity.this.getSupportFragmentManager(); List fragments = fragmentManager.getFragments(); for(Fragment fragment : fragments){ if(fragment != null && fragment.getUserVisibleHint()) return (MyFragment)fragment; } return null; } 

Funcionó para mí

Sé que ha pasado un tiempo, pero lo haré aquí en caso de que ayude a alguien.

La respuesta correcta de lejos es (y la seleccionada) la de CommonsWare. Estaba teniendo el mismo problema que el publicado, el siguiente

 MyFragmentClass fragmentList = (MyFragmentClass) getSupportFragmentManager().findFragmentById(R.id.fragementID); 

siguió volviendo nulo. Mi error fue realmente tonto, en mi archivo xml:

  

El error fue que tenía Android: etiqueta INSTEAD OF android: id .

Puede crear un campo en su clase de actividad principal:

 public class MainActivity extends AppCompatActivity { public Fragment fr; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } } 

Y luego dentro de cada clase de fragmento:

 public class SomeFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ((MainActivity) getActivity()).fr = this; } 

Su campo ‘fr’ es fragmento actual Objeto

Está funcionando también con popBackStack ()

Si está utilizando BackStack … y SOLAMENTE si está utilizando la stack trasera, intente esto:

 rivate Fragment returnToPreviousFragment() { FragmentManager fm = getSupportFragmentManager(); Fragment topFrag = null; int idx = fm.getBackStackEntryCount(); if (idx > 1) { BackStackEntry entry = fm.getBackStackEntryAt(idx - 2); topFrag = fm.findFragmentByTag(entry.getName()); } fm.popBackStack(); return topFrag; } 

La respuesta de @Hammer funcionó para mí, estoy usando para controlar un botón de acción flotante

 final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View view) { android.app.Fragment currentFragment = getFragmentManager().findFragmentById(R.id.content_frame); Log.d("VIE",String.valueOf(currentFragment)); if (currentFragment instanceof PerfilFragment) { PerfilEdit(view, fab); } } }); 

Si está definiendo el fragmento en el esquema XML de la actividad, en la Activity asegúrese de llamar a setContentView() antes de llamar a findFragmentById() .