extends Fragment Zugriff auf MainActivity?

P

Patpa

Neues Mitglied
0
Guten Abend Leute,
um mein Programm ein wenig übersichtlicher zu gestalten möchte ich gerne mein Fragment aus der MainActivity in eine eigene *.java Datei auslagern. Mit
Code:
                FragmentManager fragmentManager = getFragmentManager();
		FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
		Fragment frag = new OSMdroidFragment();
		fragmentTransaction.replace(R.id.main_view, frag);
		fragmentTransaction.commit();
klappt schonmal der Aufruf der Klasse
Code:
public class OSMdroidFragment extends Fragment 
	{
		public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
	    {
	        View mainView       = inflater.inflate(R.layout.mainview, container, false);
	        
	        return mainView;
	    }
	}
So jetzt kommt aber die Stelle an der ich wegen mein unwissenheit/unerfahrenheit einfach nicht mehr weiter komme. In der MainActivity sind die meisten Variablen/Objekte global definiert damit ich bequem von verschiedenen Methoden darauf zugreifen kann. Im Layout des Fragments befinden sich jetzt auch verschiedene Objekte wie zum Beispiel TextViews
Code:
tv_solution         = (TextView) mainView.findViewById(R.id.tv_solution);
Der Text dieses TextViews wird jetzt aber in einer Methode innerhalb der MainActivity erzeugt. Jetzt ist meine Frage wie kann ich die Verknüpfung herstellen? Bei anderen Klassen die ich ausgelagert habe hat ein "extends MainActivity" ausgereicht aber wie funktioniert dass bei einem Fragment? Hier benötige ich ja "extends Fragment".
Weiß jemand wie ich das händeln kann?
Gruß
Patpa
 
Japp, ein beliebtes Problem.

Kann man lösen, indem man die Activity in onAttach in einer Instanzvariable abspeichert.

Code:
private MainActivity mActivity;
public void onAttach( Activity a ) {
  super.onAttach(a);
  mActivity = (MainActivity)a;
}
...irgendwo später...
mText.setText( mActivity.holeText() );
Bonuspunkte gibt es, wenn man ein Interface für die Activity definiert und dort die "Callbacks" deklariert, mit denen man vom Fragment aus auf die Activity zugreifen will.
 
Hey GoldeneMitte!
erstmal Danke :) klingt ja mal gar nicht so kompliziert. Werde es gleich morgen mal ausprobieren und dann Berichten. Ist es damit auch möglich andere Variablen wie zum Beispiel Int-Werte zu übernehmen?
Gruß
Patpa
 
Logo, schreibst dir halt entsprechende Zugriffsmethoden. Deshalb ja der Hinweis mit dem Interface. :D
 
Wenn die Methode nur für dieses eine TextView benötigt wird, wäre es aber sinnvoller diese auch in die Fragment Klasse zu tun.
Aber das kommt natürlich stark drauf an was die Methode genau macht.

Aber man braucht die Activity eigentlich nicht speichern.
eigentlich müsste man jederzeit mit getActivity() an die Activity kommen.
 
Also ich hab folgende Situation: in der MainActicity läuft ein Service der jede sec werte liefert paar werte müssen dann im fragment über textviews angezeigt werden und mit wieder anderen variablen muss im fragment gearbeitet werden(double,int,strig). Die Variablen/Objekte sind werden global in der mainactivity definiert.
Hatte jetzt leider noch keine Zeit die vorschläge von goldenerMitte auszuprobieren bzw. in die Richtung zu suchen.
Gruß Patpa
 
Achtung: Service ist unter Android ein feststehender Begriff für einen Serverprozess, der im Manifest gesondert deklariert und behandelt wird. Der läuft a priori nicht "in der Activity". Das meinst du sicher nicht :D
 
Gut muss zugeben ich bin wirklich unerfahren was das alles angeht. In der onCreate Methode der Klasse MainActivity wird der Service über einen startService Befehl gestartet. Die Kommunikation erfolgt mit "ServiceConnection" also über Messages. Aufruf hiervon erfolgt über eine bindService Anweisung. Dann habe ich noch eine Klasse welche die ankommenden Messages über eine switch/case Anweisung zuordnet und anschließend ihren Inhalt an verschiedene, in der MainActivity definierte, Variablen zuweist bzw. den Text über eine setText Anweisung in die TextView setzt.
Hab das ganze nicht 100% verstanden aber es läuft also lass ich die Finger davon. Weil die Variablen/Objekte ja global in der Klasse MainActivity definiert werden habe ich jetzt eigentlich nicht gedacht dass es eine Rolle spielt.
Ich glaube du überschätzt mich :) verstehe die ganze zusammenhänge noch nicht.
Kam leider heute wieder nicht dazu es auszuprobieren und morgen bin ich mir auch nicht sicher ... sry.
 
Oh, dann ists in der Tat ein "richtiger" Service.

Für das, was du da machst, ist das komplexer als nötig, da hätte es ein Thread getan.
Services sind eher dafür da, wenn die App was tun soll, während du auch in anderen Apps bist.

Aber wenn der Teil schon funzt, ists ja gut :D
 
Der Service stellt unteranderem Koordinaten zur Verfügung und die sollen vielleicht irgendwann mal auch von anderen Applikationen verwendet werden deswegen der Service. Für mein Programm spielt das jetzt erstmal keine Rolle.
Also bleibt es dabei ich benötige für die Variablen ein Interface? Hab zwar gestern schon ein wenig gegoogelt aber kann mir darunter immer noch nichts vorstellen. Werde jetzt mal die Mittagspause nutzen um weiter zu suchen.
Gruß
Patpa
 
Hab mir jetzt mal das Fragment-Beispielprojekt von der Developer Seite heruntergeladen und mal anhand dieses Beispiels versucht einen Int-Wert zu übergeben ... leider ohne Erfolg hat immer den Wert 0. Ich finde das ganze auch recht umständlich und bin grad am überlegen ob es nicht möglich wäre einfach eine Klasse mit extends MainActivity zu erzeugen in welcher sich eine Methode befindet welche das Fragment aufruft, welches sich in der selben Klasse befindet und somit ja auch den Zugriff auf alle Variablen/Objekte besitzt. Damit könnte ich mir doch das ganze mit dem Interface sparen oder?

Der ursprüngliche Beitrag von 12:18 Uhr wurde um 13:40 Uhr ergänzt:

Mmh ... nach kurzer Euphorie kommt bittere Ernüchterung ... also lässt sich alles fehlerfrei programmieren
Code:
public class OSMdroidFragment extends MainActivity
	{
		 void setFragment() 
		{
			map = true;
			FragmentManager fragmentManager = getFragmentManager();
			FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
			MapFragment frag = new MapFragment();
			fragmentTransaction.add(R.id.map_view, frag);
			fragmentTransaction.commit();
		}
		public class MapFragment extends Fragment
		{
			public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
		    {
		        View mainView       = inflater.inflate(R.layout.mainview, container, false);
Leider kommt es erst gar nicht zum Aufruf der Fragment Klasse sondern stürzt nach der Zeile
Code:
fragmentTransaction.commit();
ab. Die Meldung innerhalb der Fehlermeldung "Activity has been destroyed" hört sich nicht wirklich hoffnungsvoll an. Jemand eine Idee was da falsch läuft? werde mal googlen was es mit dem ".commit()" auf sich hat weil damit kann ich grad gar nichts anfangen.
 
Ich glaube ich hab den Fehler gefunden:
android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.thomas_smart/com.example.thomas_smart.OSMdroidFragment}; have you declared this activity in your AndroidManifest.xml?

aber warum muss ich eine neue activity erstellen? soll doch in der MainActivity laufen ...
 
Du hast doch eine neue Activity erstellt deine OSMdroidFragment Activity.
Dann musst du diese auch nutzen und im Manifest eintragen.

Ich versteh nur nicht warum du das ganze nicht direkt in die MainActivity Klasse geschrieben hast.

Jetzt musst du 2 Klassen weiter entwickeln.
 
Ist die neue Klasse dann automatisch auch eine neue Activity? hab auch noch weitere Klassen mit z.B. Diagrammen da habe ich auch keine Activity definiert. Sry, wegen meiner Unwissenheit :)

Das ganze ist eine Thesis und das Programm an sich läuft ja schon. Nur habe ich jetzt erfahren dass ich eine ziemlich strenge Korreferentin bekomme und ich denk mir mal dass sie den Quelltext eher nicht versteht wird sondern sich eher die Struktur anschaut und da sollten halt paar Inhalte des Programms ausgelagert sein.

Ursprünglich befand sich ja das Fragment auch in der MainActivity und funktionierte einwandfrei.

Muss ich jetzt nur
<activity android:name="com.example.thomas_smart.OSMdroidFragment" />
eintragen?

Anscheinend nicht ... wie meinst du dass mit zwei Klassen weiter entwickeln? OSMdroidFragment und MapFragment?
 
Zuletzt bearbeitet:

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
5
Aufrufe
114
swa00
swa00
S
Antworten
0
Aufrufe
587
Sergio13
S
M
Antworten
3
Aufrufe
852
maksimilian
M
Zurück
Oben Unten