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");