Llamar a un método Fragment desde una actividad padre

124

Veo en la Guía de desarrollo de Android Fragments que una "actividad puede llamar a métodos en un fragmento al adquirir una referencia al Fragment de FragmentManager, usando findFragmentById()o findFragmentByTag()".

El siguiente ejemplo 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.

gcl1
fuente

Respuestas:

210

No entiendo exactamente la pregunta, ya que es demasiado simple:

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

Actualización: para aquellos que usan Kotlin

var fragment = supportFragmentManager.findFragmentById(R.id.frameLayoutCW) as WebViewFragment
fragment.callAboutUsActivity()
Dheeresh Singh
fuente
10
OK, eso fue fácil, gracias (soy nuevo en fragmentos). Ahora la parte difícil es que no puedo obtener una referencia al fragmento en primer lugar. 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 según mi rastreo, nunca se llama. Aquí es donde me estoy rascando la cabeza. Agradezco cualquier sugerencia.
gcl1
34
¿Cómo puedo obtener la identificación del fragmento?
Narendra Singh
8
¡Al hacer esto terminé en una referencia de objeto nulo!
Alok Rajasukumaran
3
@Fattie, ¿qué pasa si no tengo una etiqueta de fragmento?
Vaclovas Rekašius Jr.
55
No declaró el fragmento en xml ... así que no tengo la identificación del fragmento, ¿qué haré?
akash bs
76

Si está utilizando "import android.app.Fragment;" Luego use:

1)

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

Donde R.id.example_fragment es más probable que la identificación FrameLayout dentro de su diseño xml. O

2)

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

Donde FragTagName es el nombre que especificó cuando lo hizo:

TabHost mTabHost.newTabSpec(“FragTagName”)

Si está utilizando "import android.support.v4.app.Fragment;" Luego use:

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(); 
Gene
fuente
1
Tengo un CoordinatorLayout con id R.id.example_fragment, su retorno nulo. Estoy usando import android.support.v4.app.Fragment; ¿qué hacer?
Kishore
Le sugiero que publique esto como una nueva pregunta e incluya su código de muestra. Es difícil determinar la fuente del problema sin ver el código real.
Gene
9

Si está utilizando una biblioteca de soporte, querrá hacer algo como esto:

FragmentManager manager = getSupportFragmentManager();
Fragment fragment = manager.findFragmentById(R.id.my_fragment);
fragment.myMethod();
JDJ
fuente
4
  1. Si no está utilizando un Fragmento de biblioteca de soporte, haga lo siguiente:

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


2. Si está utilizando un Fragmento de biblioteca de soporte, haga lo siguiente:

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

Chintan Shah
fuente
3

Creo que lo mejor es verificar si se agrega un fragmento antes de llamar al método 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>(); 
}
Surjit Singh
fuente
2

Del fragmento a la actividad:

((YourActivityClassName)getActivity()).yourPublicMethod();

De actividad a fragmento:

FragmentManager fm = getSupportFragmentManager ();

//if you added fragment via layout xml
YourFragmentClass fragment = 
(YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id);
fragment.yourPublicMethod();

Si agregó un fragmento a través del código y usó una cadena de etiqueta cuando agregó su fragmento, use findFragmentByTag en su lugar:

YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");
Bharat Vasoya
fuente
1

Primero creas un método a tu fragmentgusto

public void name()
{


}

en tu activityañades esto

agregar onCreate()método

myfragment fragment=new myfragment()

finalmente llame al método donde desea llamar agregue esto

fragment.method_name();

prueba este código

Aprende rápido
fuente
1
FragmentManager fm = getFragmentManager(); 
MainFragment frag = (MainFragment)fm.findFragmentById(R.id.main_fragment); 
frag.<specific_function_name>(); 
Kishore Reddy
fuente
1

No lo sé Java, pero en C#(Xamarin.Android) no hay necesidad de buscar el fragmento cada vez que necesita llamar al método, vea a continuación:

public class BrandActivity : Activity
{
    MyFragment myFragment;

    protected override void OnCreate(Bundle bundle)
    {       
        // ...
        myFragment = new MyFragment();      
        // ...
    }

    void someMethod()
    {
        myFragment.MyPublicMethod();
    }
}

public class MyFragment : Android.Support.V4.App.Fragment
{
    public override void OnCreate(Bundle bundle)
    {
        // ...
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle)
    {
        // ...
    }

    public void MyPublicMethod()
    {
        // ...
    }   
}

Creo que en Javati puedes hacer lo mismo.

Mehdi Dehghani
fuente
1

También se llama método de fragmentos usando una interfaz como

primero creas la interfaz

public interface InterfaceName {
    void methodName();
}

después de crear la interfaz, implemente la interfaz en su fragmento

MyFragment extends Fragment implements InterfaceName {
    @overide
    void methodName() {

    }
}

y creas la referencia de interfaz en tu actividad

class Activityname extends AppCompatActivity {
    Button click;
    MyFragment fragment;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);

        click = findViewById(R.id.button);

        fragment = new MyFragment();

        click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               fragment.methodName();
            }
        });
    }
}
mXaln
fuente
0
((HomesFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_container)).filterValidation();
príncipe
fuente