349 votes

Appeler une méthode d'activité à partir d'un fragment

J'essaie d'appeler une méthode dans mon activité à partir d'un fragment. Je veux que le fragment donne des données à la méthode et récupère les données lorsque la méthode revient. Je veux obtenir un résultat similaire à l'appel d'une méthode statique, mais sans l'utilisation de la méthode statique car elle crée des problèmes dans l'activité.

Nouveau pour les fragments, j'ai donc besoin d'une explication facile et pédagogique !

Merci !

6voto

Maya Mohite Points 320

En Kotlin, vous pouvez appeler une méthode d'activité à partir d'un fragment comme ci-dessous :

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

3voto

hispeed Points 106

Pour accéder à une fonction déclarée dans votre Activity via votre fragment, veuillez utiliser une interface, comme indiqué dans la réponse de marco.

Pour accéder à une fonction déclarée dans votre fragment via votre activité, vous pouvez utiliser ceci si vous n'avez pas de balise ou d'identifiant.

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

}

Voici la classe 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);
    }
}

Cette réponse s'adresse aux novices comme moi. Passez une bonne journée.

3voto

Droid Chris Points 122

Voici comment j'ai procédé :

première interface de fabrication

interface NavigationInterface {
    fun closeActivity()
}

Ensuite, assurez-vous que l'activité implémente l'interface et surcharge les méthodes de l'interface.

class NotesActivity : AppCompatActivity(), NavigationInterface {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_notes)
        setSupportActionBar(findViewById(R.id.toolbar))
    }

    override fun closeActivity() {
        this.finish()
    }
}

alors assurez-vous de créer l'interface listener dans le fragment

private lateinit var navigationInterface: NavigationInterface

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
): View? {
    //establish interface communication
    activity?.let {
        instantiateNavigationInterface(it)
    }
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_notes_info, container, false)
}

private fun instantiateNavigationInterface(context: FragmentActivity) {
    navigationInterface = context as NavigationInterface
}

alors vous pouvez faire des appels comme ça :

view.findViewById<Button>(R.id.button_second).setOnClickListener {
    navigationInterface.closeActivity()
}

2voto

Mathan Chinna Points 287

C'est de la classe Fragment...

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

Ce code de la classe d'activité...

 public void values(String title_txts, String bannerImgUrl) {
    if (!title_txts.isEmpty()) {

//Do something to set text 
    }
    imageLoader.displayImage(bannerImgUrl, htab_header_image, doption);
}

1voto

J'ai essayé toutes les méthodes présentées dans ce fil et aucune n'a fonctionné pour moi, essayez celle-ci. Elle a fonctionné pour moi.

((MainActivity) getContext().getApplicationContext()).Method();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X