Llamar a un método de actividad de un fragmento

Intentando llamar un método en mi actividad desde un fragmento. Quiero que el fragmento proporcione los datos del método y obtenga los datos cuando vuelva el método. Quiero lograr algo similar para llamar a un método estático, pero sin el uso de estática porque crea problemas en la actividad.

¡Nuevo en fragmentos así que necesito una explicación fácil y pedagógica!

¡Gracias!

De fragmento a actividad:

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

De la actividad al fragmento:

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

Si agregaste un fragmento a través del código y findFragmentByTag una cadena de tag cuando agregaste tu fragmento, utiliza findFragmentByTag en findFragmentByTag lugar:

 YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag"); 

Probablemente deberías intentar desacoplar el fragmento de la actividad en caso de que quieras usarlo en otro lugar. Puede hacerlo creando una interfaz que implemente su actividad.

Entonces definirías una interfaz como la siguiente:

Supongamos, por ejemplo, que desea asignarle a la actividad una Cadena y hacer que devuelva un Entero:

 public interface MyStringListener{ public Integer computeSomething(String myString); } 

Esto se puede definir en el fragmento o en un archivo separado.

Entonces tendría su actividad implementar la interfaz.

 public class MyActivity extends FragmentActivity implements MyStringListener{ @Override public Integer computeSomething(String myString){ /** Do something with the string and return your Integer instead of 0 **/ return 0; } } 

Luego, en su fragmento, tendría una variable MyStringListener y establecería el oyente en el fragmento en el método Attack (actividad de la actividad).

 public class MyFragment { private MyStringListener listener; @Override public void onAttach(Context context) { super.onAttach(context); try { listener = (MyStringListener) context; } catch (ClassCastException castException) { /** The activity does not implement the listener. */ } } } 

edit (17.12.2015): onAttach(Activity activity) is deprecated, use onAttach(Context context) instead, it works as intended

La primera respuesta definitivamente funciona pero acopla su fragmento actual con la actividad del host. Es una buena práctica mantener el fragmento desacoplado de la actividad de host en caso de que quiera usarlo en otra actividad.

Actualiza después de que entiendo más cómo funcionan los fragmentos. Cada fragmento pertenece a una actividad principal. Entonces solo usa:

 getActivity().whatever 

Desde dentro del fragmento. Es una mejor respuesta porque evitas los moldes superfluos. Si no puede evitar los moldes con esta solución, use la siguiente.

============

lo que tienes que hacer es lanzar a la actividad externa

 ((MainActivity) getActivity()).Method(); 

crear una nueva instancia confundirá el marco de Android y no podrá reconocerlo. ver también :

https://stackoverflow.com/a/12014834/1984636

https://stackoverflow.com/a/2042829/1984636

Para los desarrolladores de Kotlin

 (activity as YourActivityClassName).methodName() 

Para desarrolladores de Java

 ((YourActivityClassName) getActivity()).methodName(); 

Aunque me gusta completamente la Respuesta de Marco, creo que es justo señalar que también puede usar un marco basado en publicar / suscribir para lograr el mismo resultado; por ejemplo, si utiliza el bus de eventos, puede hacer lo siguiente

fragmento :

 EventBus.getDefault().post(new DoSomeActionEvent()); 

Actividad:

  @Subscribe onSomeActionEventRecieved(DoSomeActionEvent doSomeActionEvent){ //Do something } 

Para acceder a una función declarada en su Actividad a través de su fragmento, utilice una interfaz, como se muestra en la respuesta de marco.

Para acceder a una función declarada en su Fragmento a través de su actividad, puede usar esto si no tiene una etiqueta o una identificación.

 private void setupViewPager(ViewPager viewPager) { //fragmentOne,fragmentTwo and fragmentThree are all global variables fragmentOne= new FragmentOne(); fragmentTwo= new FragmentTwo(); fragmentThree = new FragmentThree(); viewPagerAdapteradapter = new ViewPagerAdapter(getSupportFragmentManager()); viewPagerAdapteradapter.addFragment(fragmentOne, "Frag1"); viewPagerAdapteradapter.addFragment(fragmentTwo, "Frag2"); viewPagerAdapteradapter.addFragment(fragmentThree, "Frag3"); //viewPager has to be instantiated when you create the activity: //ViewPager viewPager = (ViewPager)findViewById(R.id.pager); //setupViewPager(viewPager); //Where R.id.pager is the id of the viewPager defined in your activity's xml page. viewPager.setAdapter(viewPagerAdapteradapter); //frag1 and frag2 are also global variables frag1 = (FragmentOne)viewPagerAdapteradapter.mFragmentList.get(0); frag2 = (FragmentTwo)viewPagerAdapteradapter.mFragmentList.get(1);; //You can use the variable fragmentOne or frag1 to access functions declared in FragmentOne } 

Este es el ViewpagerAdapterClass

  class ViewPagerAdapter extends FragmentPagerAdapter { public final List mFragmentList = new ArrayList<>(); private final List mFragmentTitleList = new ArrayList<>(); public ViewPagerAdapter(FragmentManager manager) { super(manager); } @Override public Fragment getItem(int position) { return mFragmentList.get(position); } @Override public int getCount() { return mFragmentList.size(); } public void addFragment(Fragment fragment, String title) { mFragmentList.add(fragment); mFragmentTitleList.add(title); } @Override public CharSequence getPageTitle(int position) { return mFragmentTitleList.get(position); } } 

Esta respuesta es para principiantes como yo. Tenga un buen día.

Esto es de la clase Fragment …

 ((KidsStoryDashboard)getActivity()).values(title_txt,bannerImgUrl); 

Este código de la clase de actividad …

  public void values(String title_txts, String bannerImgUrl) { if (!title_txts.isEmpty()) { //Do something to set text } imageLoader.displayImage(bannerImgUrl, htab_header_image, doption); } 

En kotlin puedes llamar al método de actividad desde un fragmento como el siguiente:

 var mainActivity: MainActivity = activity as MainActivity mainActivity.showToast() //Calling show toast method of activity 

He estado buscando la mejor manera de hacerlo, ya que no todos los métodos que queremos llamar se encuentran en el Fragmento con la misma actividad principal.

En tu Fragmento

 public void methodExemple(View view){ // your code here Toast.makeText(view.getContext(), "Clicked clicked",Toast.LENGTH_LONG).show(); } 

En tu actividad

 new ExempleFragment().methodExemple(context);