Von Activity auf Methode aus dem Fragment zugreifen


#1

Hi,

ich habe erfolgreich ein Fragment erstellt und in verschiedene Activitys implementiert.
Diese Fragment-Klasse (MainMenu.java) besitzt auch Methoden in denen ich die Buttons (Elemente des Fragments) manipuliere, zB. die Methode resetButtons().
Aber ich kann nicht heraus finden, wie ich von der Activity diese Methose resetButtons() anspreche.
zB. folgendes geht nicht:

meinMenu.resetButtons();```

[B]Wie spreche ich Methoden aus dem Fragment an?[/B]

Übrigens, ich verwende die android.support.v4.app.FragmentActivity,
da ich für API 10 programmiere.

#2

Wie fügst du das Fragment deiner View hinzu? Falls du das programmatisch über den FragmentManager machst hast du doch schon eine Instanz deiner Klasse und kannst darauf deine Methoden aufrufen.
Ist dein Problem vielleicht nur, dass du zwei unterschiedliche Instanzen deiner Klasse hast?


#3

Ich füge das Fragment über die xml der Activity hinzu.
In dieser xml steht (Auszug):
[XML] [/XML]


#4

Auf “abstrakter” Ebene per [INLINE]getFragmentManager().findFragmentById(R.id.frag_main_menu);[/INLINE]
Du musst dann die erhaltene Referenz ggf. noch auf MainMenu casten, falls Du auf konkrete Methoden der Fragment Klasse zugreifen willst.

Für einen abstrakteren Zugriff wäre es bei Bedarf möglich ein Interface zu definieren, welches alle Fragments implementieren um dann in der Activity auf dieses Interface zu casten.


#5

Mein Problem hat womöglich damit zu tun, dass ich für API 10 programmiere und getFragmentManager() erst ab API 11 vorgesehen ist.
(siehe android.support.v4.app.FragmentActivity)

Die Tutorials beruhen im Allgemeinen alle auf android.FragmentActivity, was mir dann halt nicht so viel nützt.
Ich habe da schon einiges rumprobiert und bekomme immer irgendwann die Meldung wie:
[I]Call requires API level 11 (current min is 4): android.app.Activity#getFragmentManager[/I]

[B]Aber es muss doch auch für die support-Variante eine Lösung geben?![/B]


#6

[QUOTE=frankmehlhop;63657][B]Aber es muss doch auch für die support-Variante eine Lösung geben?![/B][/QUOTE]
Wenn es eine gibt sollte diese problemlos zu finden sein.
Evtl: http://developer.android.com/reference/android/support/v4/app/FragmentActivity.html#getSupportFragmentManager%28%29


#7

[QUOTE=_Michael;63631]Du musst dann die erhaltene Referenz ggf. noch auf MainMenu casten, falls Du auf konkrete Methoden der Fragment Klasse zugreifen willst.[/QUOTE]

Vielen Dank Michael,

ich merke mal wieder, dass ich das Suchen noch üben muss. :wink:

Jetzt kann ich das FragmentsTransaction-Objekt erzeugen.
Du schreibst, ich müsse es casten, um die Methode der MainMenu.java nutzen zu können.
Hier komme ich leider nicht weiter.
Fragments und FragmentsTransaction sind Siblings und daher nach meinem Verständis nich castbar
(da sie nicht voneinander erben).

		ft.replace(R.id.frag_main_menu, new MainMenu());
		ft.commit();
		
		MainMenu mm = (MainMenu) ft;```
In der letzen Zeile gibt es die Fehlermeldung:

> Cannot cast from FragmentTransaction to MainMenu


[B]Wie ist es möglich zu casten und mit dem (einem) Objekt von MainMenu auf die Methoden daraus zuzugreifen?[/B]

#8

Mir ist nicht klar warum Du das bereits via xml eingefügte Fragment mit einer neuen Instanz von MainMenu ersetzen willst??? Die Transaction brauchst Du hier doch gar nicht. (In dem Fall könnte man ja einfach eine Referenz auf das neu erzeugte MainMenu in einer Variablen halten und sich den Cast sparen)
Hab auch keine Ahnung was Du mit “Fragments und FragmentsTransaction sind Siblings” meinst.
Ein Fragment ist nunmal keine FragmentTransaction und eine FragmentTransaction somit auch nicht in ein konkretes Fragment castbar. Du musst Dir ja nur mit der von mir oben beschriebenen Methode bzw. der Supportmethode das abstrakte Fragment holen und dieses casten.


#9
		MainMenu mm = (MainMenu) getSupportFragmentManager().findFragmentById(R.id.frag_main_menu);
		mm.resetUnit();	```

Ja, ich denke jetzt funktioniert es.
Zumindest bekomme ich soweit keine Fehlermeldungen.

Vielen Dank Michael für deine Geduld mit mir.
Mir fehlt es sicher noch an Übung.

:D