studio pasar otro navegar navegacion llamar fragments fragmento entre dinamicos desde comunicacion cambiar activity android android-fragments

android - pasar - Llamar a un método de actividad desde un fragmento.



navegar entre fragments android studio (9)

Esto es de clase Fragmento ...

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

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

¡Novedad en fragmentos por lo que necesito una explicación fácil y pedagógica!

¡Gracias!


Actualizar después de que entiendo más cómo funcionan los fragmentos. Cada fragmento pertenece a una actividad padre. Así que solo usa:

getActivity().whatever

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

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

Lo que tienes que hacer es lanzar a la actividad exterior.

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

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

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

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


Aunque me gusta la respuesta de Marco, creo que es justo señalar que también puede usar un marco basado en publicación / suscripción para lograr el mismo resultado, por ejemplo, si va con el bus de eventos, puede hacer lo siguiente

fragmento :

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

Actividad:

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


En kotlin puedes llamar al método de actividad de 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 a los que queremos llamar están ubicados en 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);


Para acceder a una función declarada en su Actividad a través de su fragmento, use 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 ID

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<Fragment> mFragmentList = new ArrayList<>(); private final List<String> 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 los noobs como yo. Tenga un buen día.


Para desarrolladores de Kotlin.

(activity as YourActivityClassName).methodName()

Para desarrolladores de Java.

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


Probablemente debería tratar de desacoplar el fragmento de la actividad en caso de que quiera usarlo en otro lugar. Puede hacer esto creando una interfaz que implemente su actividad.

Así que definirías una interfaz como la siguiente:

Supongamos, por ejemplo, que deseaba asignar una cadena a la actividad 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ías tu actividad implementando 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 método Fragment onAttach (Actividad de 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 combina su fragmento actual con la actividad del host. Es una buena práctica mantener el fragmento desacoplado de la actividad del host en caso de que desee utilizarlo en otra actividad.


Del fragmento a la 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 agregó un fragmento a través del código y usó una cadena de tag cuando agregó su fragmento, use en findFragmentByTag lugar findFragmentByTag :

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