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!
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");
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.
Für Kotlin Entwickler
(activity as YourActivityClassName).methodName()
Für Java Entwickler
((YourActivityClassName) getActivity()).methodName();
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 :
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
}
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
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.
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();
((KidsStoryDashboard)getActivity()).values(title_txt,bannerImgUrl);
public void values(String title_txts, String bannerImgUrl) {
if (!title_txts.isEmpty()) {
//Do something to set text
}
imageLoader.displayImage(bannerImgUrl, htab_header_image, doption);
}
((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);