Anfänger braucht Hilfe bei den Fragmenten

  • 24 Antworten
  • Letztes Antwortdatum
A

awacs75

Neues Mitglied
0
Hallo zusammen,

ich benötige mal eure Hilfe bei einer Grundlegenden Frage, bzw. 2 Fragen..

Zuerst:
Jedes Tutorial das man sich anschaut oder auch jedes Buch das ich mir bisher gekauft oder im Buchladen angeschaut habe (auch die die 2014 erschienen sind) arbeiten immer OHNE Fragmente in eclipse.
Dort wird nirgendwo zb die fragment_main.xml erwähnt oder auch nur davon gesprochen.

Kann mir das jemand erklären, wieso das so ist?

Und 2. Frage ist etwas ausführlicher.
Ich versuche eine Beispiel-App aus einem der Bücher in der aktuellen eclipse Version umzusetzen(die mit den fragmenten*ggg*) und habe in der MainActivity.java folgende Passage drin:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment())
.commit();
}

}

Wenn ich danach google, dann finde ich auch genau diese Einträge zu dutzend in Postings.
Also muss ich ja davon ausgehen das die an sich korrekt sind.

Nun schmeisst er mir immer den "Fehler/Hinweis" raus, das R.id.container cannot be resolved or is no field.

Nach einigem Lesen, und wenn ich das richtig verstanden habe, steht an dieser Stelle die ID von dem Element in meinem Layout das ich ansprechen will.
Die ID "container" gibt es im Layout jedoch nicht, da laut der Bsp-App jedes einzelne Element in dem Layout eine eigene ID hat.

Daher ist dieser Fehler im ersten Schritt ja auch erstmal logisch und für mich auch nachzuvollziehen.

Jetzt kommt allerdings mein Verständnisproblem:
WAS zum Henker muss ich anstelle des "container" da angeben, damit es auch läuft?
Da ich in meinem Layout (fragment_main.xmml) 6 verschiedene IDs für TextViews und Buttons eingebaut habe, kann ich ja nicht 6 IDs da gleichzeitig ansprechen????

Da ist glaub ich der Knackpunkt, wo ich euch bitte mir behilflich zu sein und mir mal für "dumm" zu erklären, was dieses container genau ist usw.

Vielen Dank im Voraus.
Wenn ihr noch Infos braucht, dann stelle ich die gerne zur Verfügung.
 
1.) Man kann seine App ganz ohne Fragmente schreiben.Dann braucht man auch keine fragment.xml.

2.) R.id.container ist die ID einer ViewGroup, wo das Fragment in das Activity Layout eingebaut werden soll. Diese stelle muss im Layout der Activity definiert sein.

Bein einfachen (Test-) Anwendungen kann man die Fragmente getrost erstmal ignorieren. Die Dinger werden m.E. erst dann interessant, wenn man in seiner App mit mehreren Ansichten auf seine Daten arbeitet. Typischer Fall: Du hast eine App mit einer Liste von Daten (ListActivity) und einer Ansicht für deteils zu einem Eintrag. In der Phone-Sicht soll man immer nur eine, auf dem Tablet beide gleichzeitig sehen. DANN sind Fragments sehr sinnvoll.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: awacs75
Hallo DieGoldeneMitte,

erstmal danke für deine Antwort.
Da die neuen Android Developer Tools aber nur noch mit Fragmenten von Hause aus starten, macht es ja auch durchaus Sinn diese zu nutzen oder?

zu 2. Was ist denn bitte die View Group?

Meine Layout Datei sieht folgendermassen aus:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="de.omsa4u.firstapp.MainActivity$PlaceholderFragment" >

<TextView
android:id="@+id/textView_hinweisText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/textView_hinweis" />

<EditText
android:id="@+id/editText_eingabe"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView_hinweisText"
android:layout_below="@+id/textView_hinweisText"
android:layout_marginTop="57dp"
android:ems="10" >

<requestFocus />
</EditText>

plus noch einige TextViews mehr....

</RelativeLayout>

Was muss ich da jetzt als container eintragen?
 
1.) Das von den Tools ist ja nur ein Vorschlag. Fragmente sind eine extra Komplexität. Dinge einfach zu halten ist auch eine Tugend. :D

2.) Eine ViewGroup ist ein View, der weitere Views enthält - also bei dir wäre das wohl das RelativeLayout. Aber hier sieht man schon das Problem. Du hast deine Views in die Activity rein getan. Was soll da noch in das Fragment? ;-)

Du kannst die Views natürlich stattdessen ins Fragmentlayout hineintun, wenn du unbedingt Fragmente benutzen willst. Aber dann funktionert die hälfte nicht mehr im onCreate(), sondern muss dann ins onViewCreated() wo man dann wieder aufpassen mus findViewById im richtigen Objekt aufzurufen und so weiter und so weiter...

Ich muss sagen, dass die Nutzung von Fragmenten mir den Spaß am App Design ziemlich reduziert hat.
 
Zuletzt bearbeitet:
Google hat da scheinbar einen großen fehler gemacht in das template ein fragment einzubauen.

da blickt keiner durch ;)
 
Fragmente werden (meiner Meinung nach) nur "standardmäßig" hinzugefügt, weil Google damit seine Tablets etwas vorrang bringen will.
Für sehr viele Apps sind die aber wie schon erwähnt nicht nötig.

Gerade für den Anfang würde ich die wieder rauswerfen.
Die Dinger sind nämlich nicht ganz unkompliziert und gerade für Anfänger die gewisse Grundlagen nocht nicht drauf haben vllt auch zu kompliziert.
 
ich werde wohl nie verstehen wo diese Abneigung gegen Fragmente her kommt bei Leuten die schon Erfahrung mit Android Programmierung haben. Bei Anfängern kann ich das ja noch verstehen aber irgendwann sollte es dann schon mal Click machen.

Vollkommen unabhängig von Tablet oder Handy sind Fragmente so nützlich (und teilweise Voraussetzung) für so viele Arten von Navigation die über einfaches "Drück auf den Button und es öffnet sich die nächste Activity" hinaus geht.
 
  • Danke
Reaktionen: DieGoldeneMitte
JustinTime schrieb:
ich werde wohl nie verstehen wo diese Abneigung gegen Fragmente her kommt

Ich denke es liegt daran, dass die Activites einfach saugut waren. Und nun ist es komplizierter geworden.

"Drück auf den Button und es öffnet sich die nächste Activity"
Das meinte ich ja. Für dieses Verhalten braucht es kein Fragment und dann sollte man auch keins nehmen.
 
Das ist ja keine Abneigung gegen Fragmente ;)
Ich finde das die sogar gut und durchdacht.

Nur wie @DieGoledeneMitte schon sagt:
Anfänger sind damit überfordert, für diese ist es schon schwierig genug zu erkennen was eine Activity ist und was diese macht und was man damit nicht machen darf ;)
Wie oft ich hier schon ein "new MainActivity()" gesehen habe mit verwunderung darüber dass dann irgendwo ein NullPointer fliegt ;)
 
Hallo zusammen,

erst einmal vielen Dank für die vielen Antworten..
Der Hauptgrund wieso ich mich am Anfang schon mit Fragmenten beschäftigen MUSS, ist der das es in der activity_main.xml mit der neuen Version der ADT nicht mehr möglich ist, eingefügte Elemente per Drag&Drop zu positionieren.

Wenigstens hab ich noch keinen Weg gefunden, WIE das doch gehen könnte.
In der fragment_main.xml ist dies jedoch problemlos möglich, denn wenn ich das richtig verstanden habe ist die :
activity_main.xml das Grundgerüst, und die fragment_main.xml wird dann bei einem entsprechenden Aufruf quasi über das Grundgerüst drüber gelegt.

Was mich jetzt aber nochmal zurück bringt zu dem Aufruf der Viewgruppe.
Ich hab das jetzt so verstanden, dass .add(R.id.container die Viewgruppe aufrufen soll, die in meinem Falle dann zb. Relative_Layout wäre.
Muss ich dann jetzt in der fragment_main.xml hingehen und dort direkt nach dem Relative_Layout einfach die ID einfügen, oder muss ich in dem Aufruf das "container" gegen "Relative_Layout" ersetzen?

Sorry für die vielen Anfängerfragen, aber ich möchte es gleich von Anfang an richtig und vorallem vollständig verstehen, was ich da mache.
Sicher könnte ich die Fragmente einfach rauswerfen, was aber das Problem des Positionierens, und vorallem auch das Verständniss die Zukunft betreffend nicht lösen würde :)

MfG
 
Hallo awacs75,

ich empfehle dir direkt die XML in Textform zu bearbeiten, statt über Drag&Drop.
So hat man die Möglichkeit viel mehr Einstellungen zu benutzen und das Positionieren sollte auch auf mehr Engeräten funktionieren.
 
Kardroid schrieb:
Hallo awacs75,

ich empfehle dir direkt die XML in Textform zu bearbeiten, statt über Drag&Drop.
So hat man die Möglichkeit viel mehr Einstellungen zu benutzen und das Positionieren sollte auch auf mehr Engeräten funktionieren.

Hi,

vielen Dank für den gut gemeinten Rat, und wenn ich jemand wäre der schnell aufgibt, dann würde ich den auch sofort befolgen, da mir das einiges an "Ärger" ersparen würde.

Jedoch würde das einfache umgehen der Fragmente ja nicht mein jetziges Problem zufriedenstellend lösen.

Habe jetzt einfach mal in der fragment_main.xml die id "container" vergeben, damit ich nicht mehr den Hinweis bekomme das er container nicht kennt, dafür kommt dann jetzt die Fehlermeldung das :
The method add(int, Fragment) in the type FragmentTransaction is not applicable for the arguments (int, MainActivity.PlaceholderFragment) MainActivity.java

Irgendwie drehe ich mich im Kreis :)
 
awacs75 schrieb:
Habe jetzt einfach mal in der fragment_main.xml die id "container" vergeben, damit ich nicht mehr den Hinweis bekomme das er container nicht kennt, dafür kommt dann jetzt die Fehlermeldung das :
The method add(int, Fragment) in the type FragmentTransaction is not applicable for the arguments (int, MainActivity.PlaceholderFragment) MainActivity.java

Irgendwie drehe ich mich im Kreis :)

Das könnte ein Problem mit den imports und den Verschiedenen Fragment Klassen sein. Es gibt einmal das normale Fragment android.app.Fragment für "neuere" Android Versionen und ein Support Fragment android.support.v4.app.Fragment für alte Android Versionen.

Genau so sieht es mit den FragmentTransactions aus. Da gibt es einmal android.support.v4.app.FragmentTransaction und android.app.FragmentTransaction.

Entweder du entfernst alle Imports die auf android.support.v4.app Fragmentkram verweisen und importierst die normalen oder du benutzt überall die Support Sachen und benutzt stat des Fragmentmanagers den Supportfragmentmanager. Dann muss deine Activity aber von Fragmentactivity abgeleitet sein und nicht von Activity.

Ich hoffe das war einigermaßen verständlich.
 
Ich glaube ich habe da etwas ganz essentielles noch nicht verstanden.

Muss ich für jede fragment.xml Datei auch eine eigene Klasse anlegen?
An welche Stelle muss ich die ID in der fragment.xml angeben, wenn ich da mehrere TextViews drin habe, die ja auch eine eigene ID haben?

Momentan seh ich den Wald vor lauter Bäumen nicht mehr und habe das Gefühl bisher noch gar nichts verstanden zu haben...

Der ursprüngliche Beitrag von 10:31 Uhr wurde um 10:38 Uhr ergänzt:

Hat jemand von euch irgendwo ein Tut rumfliegen das MIT Fragmenten ganz von vorne beginnt, nachdem ich etwas lernen kann?
Ich kann da im Netz nichts finden, wo Fragemente mit behandelt werden. Und aus den "normalen" Tuts bekomm ich das nicht in die Softwareversion mit Fragmenten transferiert, was das Verständnis anbelangt.
 
Also nach deinem letzten Post zu urteilen würde ich an deiner Stelle ein Tutorial ohne Fragments einfach durchziehen und dann deine App eben so bauen, dass sie auch ohne Fragments läuft.
Später kannst du dann ja Fragments hinzufügen, wenn du die Grundkenntnisse dir schon erarbeitet hast.
 
Kardroid schrieb:
Also nach deinem letzten Post zu urteilen würde ich an deiner Stelle ein Tutorial ohne Fragments einfach durchziehen und dann deine App eben so bauen, dass sie auch ohne Fragments läuft.
Später kannst du dann ja Fragments hinzufügen, wenn du die Grundkenntnisse dir schon erarbeitet hast.


Da beisst die Katze sich ja in den Schwanz.
Die ganzen Tuts und Bücher die man so findet basieren alle auf einem Nicht-fragmentierten Eclipse.
Dadurch das die durch die Änderung IN Fragmente bei Eclipse aber andere Funktionen wie zb das Positionieren und noch so einige andere deaktiviert bzw verändert haben, passen die ganzen Tuts und Bücher nicht mehr.
Man KANN die nicht 1:1 durcharbeiten und danach lernen, weil immer wieder Funktionen darin angesprochen werden, die es in Eclipse so gar nicht mehr gibt. :confused2:
 
Ne du kannst die Fragmente einfach rauswerfen.
Mach ein neues Projekt und fang von ganz vorne an.

Ich bin sicher, dass man die trotzdem noch durcharbeiten kann.

Gerade mal getestet.. wenn ich in Eclipse ein neues Android Project erstelle
mit "minimum SDK" auf API9, "Blank Activity" und Navigation "None" bekomme ich ein neues Projekt ohne Fragments, ganz simple mit einer Activity.
 
Hallo amfa,

dann hast du noch eine alte Version von den ADT.
Aktuell ist die v22.6.2-1085508
Selbst wenn ich API8 auswähle was ja Froyo entspricht bekommt man Projekte mit Fragmenten.
Diese rauswerfen ist ja relativ einfach, jedoch auch unschön, weil man dann wirklich das positionieren alles per Hand und dp genau machen muss, und nicht per Drag&Drop arbeiten kann.
 
Zuletzt bearbeitet:
Stimmt ich hatte noch 22.3 installiert, aber gerade mal das update gemacht.
Jetzt nehm ich statt "Blank Activity" "Empty Activity" und bekomme ein neues projekt ohne Fragmente.

Das is quatsch wieso muss man dann das positionieren per Hand machen?!
Du kannst doch genauso gut mit dem layoutEditor arbeiten und mit Layouts die du hinzufügst.
Musst du halt alles in der activity_main.xml machen.
 
  • Danke
Reaktionen: awacs75
Und eben der LayoutEditor funktioniert in der neusten version in der activity_main.xml nicht mehr.
Habs auf 3 rechnern ausprobiert.
Du kannst das Element zwar rein ziehen, aber das wird dann automatisch fest links oben positioniert und du kannst es auch nicht mehr verschieben.
Das einzige was geht, ist die Größe ändern, aber nicht die Position.

Aber das mit der Empty Activity ist schonmal ein guter Tipp.
Danke.
 

Ähnliche Themen

M
Antworten
9
Aufrufe
789
mkuz24
M
4
Antworten
10
Aufrufe
1.080
jogimuc
J
Zurück
Oben Unten