Wywołanie metody aktywności z fragmentu

Próba wywołania metody w mojej aktywności z fragmentu. Chcę, aby fragment podawał dane metody i pobierał dane po powrocie metody. Chcę osiągnąć podobne do wywołania metody statycznej, ale bez użycia statycznej, ponieważ stwarza problemy w działaniu.

Nowy w fragmentach, więc potrzebuję łatwego i pedagogicznego wyjaśnienia!

Dzięki!

Author: Ridcully, 2012-09-30

9 answers

Od fragmentu do activty:

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

Od aktywności do fragmentu:

FragmentManager fm = getSupportFragmentManager();

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

Jeśli dodałeś fragment za pomocą kodu i użyłeś tag podczas dodawania fragmentu, użyj findFragmentByTag zamiast:

YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");
 662
Author: Richard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-04 08:22:02

Powinieneś prawdopodobnie spróbować oddzielić fragment od aktywności, jeśli chcesz użyć go gdzie indziej. Możesz to zrobić, tworząc interfejs, który implementuje Twoja aktywność.

Więc można zdefiniować interfejs jak poniżej:

Załóżmy na przykład, że chcesz nadać aktywności ciąg znaków i zwrócić liczbę całkowitą:

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

Można to zdefiniować we fragmencie lub w osobnym pliku.

Wtedy Twoja aktywność będzie realizowana interfejs.

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

}

Wtedy w Twoim fragmencie będziesz miał zmienną MyStringListener i ustawisz listener w fragmencie OnAttach(Activity activity) metoda.

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. */
            }
        }

    }

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

Pierwsza odpowiedź zdecydowanie działa, ale łączy twój obecny fragment z aktywnością gospodarza. Jego dobrą praktyką jest oddzielenie fragmentu od aktywności hosta na wypadek, gdybyś chciał użyć go w innej aktywności.

 157
Author: Marco RS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-17 19:48:01

Update po tym, jak zrozumiem więcej, jak działają fragmenty. Każdy fragment należy do aktywności rodzica. Więc po prostu użyj:

getActivity().whatever

Z wnętrza fragmentu. Jest to lepsza odpowiedź, ponieważ unikasz superflous odlewów. Jeśli nie możesz uniknąć odlewów za pomocą tego rozwiązania, skorzystaj z poniższego.

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

To, co musisz zrobić, to rzucić na zewnętrzną aktywność

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

Tworzenie nowej instancji będzie mylące ramki Androida i nie będzie w stanie go rozpoznać. Zobacz też także:

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

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

 12
Author: sivi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:13

Dla Kotlin Programiści

(activity as YourActivityClassName).methodName()

Dla Java Programiści

((YourActivityClassName) getActivity()).methodName();
 10
Author: Wasim K. Memon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-14 08:57:42

Chociaż całkowicie podoba mi się odpowiedź Marco, myślę, że należy podkreślić, że można również użyć frameworku opartego na publikacji/subskrybcji, aby osiągnąć ten sam wynik, na przykład, jeśli pójdziesz z magistralą zdarzeń, możesz wykonać następujące czynności

Fragment:

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

Aktywność:

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

}
 6
Author: A.Alqadomi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-11 11:00:35

Aby uzyskać dostęp do funkcji zadeklarowanej w Twojej aktywności za pośrednictwem Twojego fragmentu, Użyj interfejsu, jak pokazano w odpowiedzi marco.

Aby uzyskać dostęp do funkcji zadeklarowanej w Twoim fragmencie za pośrednictwem Twojej aktywności, możesz jej użyć, jeśli nie masz znacznika lub identyfikatora

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


}
To jest 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);
    }
}
Ta odpowiedź jest dla noobów takich jak ja. Miłego dnia.
 2
Author: hispeed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-26 08:05:38

To jest z klasy Fragment...

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

Ten Kod Z Klasy Activity...

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

//Do something to set text 
    }
    imageLoader.displayImage(bannerImgUrl, htab_header_image, doption);
}
 1
Author: Mathan Chinna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-18 12:14:45

W kotlinie można wywołać metodę activity z fragmentu jak poniżej:

var mainActivity: MainActivity = activity as MainActivity
        mainActivity.showToast() //Calling show toast method of activity
 1
Author: Maya Mohite,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-31 07:45:02

Szukałem najlepszego sposobu, aby to zrobić, ponieważ nie każda metoda, którą chcemy wywołać, znajduje się we fragmencie z tym samym rodzicem aktywności.

W Twoim fragmencie

public void methodExemple(View view){

        // your code here

        Toast.makeText(view.getContext(), "Clicked clicked",Toast.LENGTH_LONG).show();
    }

W Twojej aktywności

new ExempleFragment().methodExemple(context); 
 0
Author: Maravilho Singa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-09 00:02:35