wake-up-neo.com

Rufen Sie eine Aktivitätsmethode aus einem Fragment auf

Versuch, eine Methode in meiner Aktivität aus einem Fragment aufzurufen. Ich möchte, dass das Fragment die Methodendaten gibt und die Daten erhält, wenn die Methode zurückkehrt. Ich möchte einen ähnlichen Aufruf wie bei einer statischen Methode erzielen, jedoch ohne die Verwendung von statisch, da dies zu Problemen in der Aktivität führt. 

Fragmente neu, also brauche ich eine einfache und pädagogische Erklärung!

Vielen Dank!

262
Joakim Ericsson

Vom Fragment zur Aktivität:

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

Von der Aktivität zum Fragment:

FragmentManager fm = getSupportFragmentManager();

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

Wenn Sie Fragment über Code hinzugefügt haben und beim Hinzufügen Ihres Fragments eine tag-Zeichenfolge verwendet haben, verwenden Sie stattdessen findFragmentByTag:

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

Sie sollten wahrscheinlich versuchen, das Fragment von der Aktivität zu entkoppeln, falls Sie es woanders verwenden möchten. Sie können dies tun, indem Sie eine Schnittstelle erstellen, die von Ihrer Aktivität implementiert wird.

Sie würden also eine Schnittstelle wie die folgende definieren:

Angenommen, Sie möchten der Aktivität einen String geben und ihn eine Ganzzahl zurückgeben lassen:

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

Dies kann im Fragment oder in einer separaten Datei definiert werden.

Dann müsste Ihre Aktivität die Schnittstelle implementieren.

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

}

Dann hätten Sie in Ihrem Fragment eine MyStringListener-Variable und würden den Listener in der fragment onAttach-Methode (Activity activity) festlegen.

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

    }

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

Die erste Antwort funktioniert definitiv, aber sie koppelt Ihr aktuelles Fragment mit der Host-Aktivität. Es empfiehlt sich, das Fragment von der Host-Aktivität zu entkoppeln, falls Sie es in einer anderen Aktivität verwenden möchten.

183
Marco RS

Für Kotlin Entwickler

(activity as YourActivityClassName).methodName()

Für Java Entwickler

((YourActivityClassName) getActivity()).methodName();
18
Wasim K. Memon

Aktualisieren Sie, nachdem ich besser verstanden habe, wie Fragmente funktionieren. Jedes Fragment gehört zu einer übergeordneten Aktivität. Verwenden Sie also einfach:

getActivity().whatever

Aus dem Fragment heraus. Dies ist eine bessere Antwort, weil Sie überflüssige Abgüsse vermeiden. Wenn Sie die Abgüsse mit dieser Lösung nicht vermeiden können, verwenden Sie den untenstehenden.

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

was Sie tun müssen, ist, sich auf die äußeren Aktivitäten zu konzentrieren 

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

das Erstellen einer neuen Instanz wird den Android-Frame verwirren und kann ihn nicht erkennen. siehe auch : 

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

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

12
sivi

Obwohl ich die Antwort von Marco völlig mag, denke ich, dass es fair ist, darauf hinzuweisen, dass Sie auch ein Framework zum Veröffentlichen/Abonnieren verwenden können, um dasselbe Ergebnis zu erzielen 

Fragment :  

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

Tätigkeit:

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

}
8
A.Alqadomi

In kotlin können Sie die Aktivitätsmethode aus Fragment wie folgt aufrufen:

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

Um auf eine in Ihrer Activity über Ihr Fragment deklarierte Funktion zuzugreifen, verwenden Sie eine Schnittstelle, wie in der Antwort von marco gezeigt.

Für den Zugriff auf eine in Ihrem Fragment über Ihre Aktivität deklarierte Funktion können Sie diese verwenden, wenn Sie keinen Tag oder keine ID haben

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


}

Dies ist die 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);
    }
}

Diese Antwort gilt für Noobs wie mich. Haben Sie einen guten Tag.

2
hispeed

Ich habe mit allen in diesem Thread gezeigten Methoden versucht und keine funktionierte für mich, versuchen Sie diese. Es hat bei mir funktioniert.

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

Dies ist aus der Fragmentklasse ...

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

Dieser Code aus der Aktivitätsklasse ...

 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
Mathan Chinna

((YourActivityName)getActivity()).functionName();

Beispiel: ((SessionActivity)getActivity()).changeFragment();

Hinweis: Der Klassenname sollte öffentlich sein

Ich habe nach dem besten Weg gesucht, dies zu tun, da sich nicht jede Methode, die wir aufrufen möchten, in Fragment mit demselben Activity Parent befindet.

In deinem Fragment

public void methodExemple(View view){

        // your code here

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

In Ihrer Aktivität

new ExempleFragment().methodExemple(context); 
0
Maravilho Singa