2012-06-05 30 views
86

Veo en el Android Fragments Dev Guide que una "actividad puede invocar métodos en un fragmento al adquirir una referencia al Fragmento desde FragmentManager, usando findFragmentById() o findFragmentByTag()".Llamar a un método de fragmento desde una actividad primaria

El ejemplo siguiente muestra cómo obtener una referencia de fragmento, pero no cómo llamar a métodos específicos en el fragmento.

¿Alguien puede dar un ejemplo de cómo hacer esto? Me gustaría llamar a un método específico en un Fragmento de la Actividad principal. Gracias.

Respuesta

159

no reciben la pregunta tal y como es demasiado simple:

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.<specific_function_name>(); 
+9

OK, eso fue fácil, gracias (soy nuevo en los fragmentos). Ahora la parte difícil es que, al parecer, no puedo obtener una referencia al fragmento. No está definido en un diseño XML, por lo que no puedo usar findFragmentById().Y no me queda claro por el código que estoy siguiendo (ref arriba) cómo/dónde se crea el fragmento. Si fuera así, podría agregar una etiqueta y usar findFragmentByTag(). La parte AccountListActivity del ejemplo tiene una llamada a beginTransaction(). Add(), pero por mi rastreo nunca se llama. Aquí es donde me estoy rascando la cabeza. Agradezco cualquier sugerencia. – gcl1

+0

Lo siento, dejé fuera la referencia. El patrón de código que estoy siguiendo es [FragmentTabsPager] (http://developer.android.com/resources/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsPager.html). Gracias. – gcl1

+0

La situación será diferente cuando ninguno de los dos tenga la ID ni la etiqueta asociada con el fragmento. –

8

Si está utilizando una biblioteca de apoyo, tendrá que hacer algo como esto:

FragmentManager manager = getSupportFragmentManager(); 
Fragment fragment = manager.findFragmentById(R.id.my_fragment); 
fragment.myMethod(); 
66

Si está utilizando “importación android.app.Fragment;” use:

1)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

Donde R.id.example_fragment es probablemente la ID de FrameLayout dentro de su diseño xml. O

2)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 

Dónde FragTagName es el nombre u especificado cuando u hizo:

TabHost mTabHost.newTabSpec(“FragTagName”) 

Si está utilizando “android.support.v4.app importación. Fragmento; " Luego use cualquiera de los siguientes:

1)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

O

2)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 
+1

Tengo un CoordinatorLayout con identificación R.id.example_fragment, su regreso nulo. Estoy usando import android.support.v4.app.Fragment; ¿qué hacer? – Kishore

+0

Sugiero que publique esto como una nueva pregunta e incluya su código de muestra. Es difícil decir la fuente del problema sin ver el código real. – Gene

3
  1. Si no está utilizando una biblioteca de fragmentos de apoyo, a continuación, hacer lo siguiente:

((FragmentName) getFragmentManager().findFragmentById(R.id.fragment_id)).methodName();


2. Si está utilizando una biblioteca de fragmentos de apoyo, a continuación, haga lo siguiente:

((FragmentName) getSupportFragmentManager().findFragmentById(R.id.fragment_id)).methodName();

3

Creo que lo mejor es comprobar si se añade antes de llamar al método fragmento en fragmento. Haga algo como esto para evitar una excepción nula.

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
if(fragment.isAdded()){ 
    fragment.<specific_function_name>(); 
} 
Cuestiones relacionadas