Quiz in Fragment umsetzen

M

Manuel1805

Ambitioniertes Mitglied
2
Hallo zusammen,

ich habe im Internet den Code für ein Quiz gefunden:

Quiz App- Fragen speichern und mit Buttons u. TextView verbinden — Android Forum - AndroidPIT

Der Code lässt sich auch einwandfrei umsetzen. Ich möchte diesen Code gerne mit Fragments umsetzen. Leider komme ich hier nicht weiter. Vielleicht weiß jemand die Lösung.

Ich füge diesem Post die Fehlermeldung und den Code bei. Vielen Dank schon mal.

#############################
Ich habe den Text:

((TextView) quizActivity.findViewById(R.id.frage)).setText(frage);

Durch den folgenden ersetzt:

((TextView) quizActivity.getActivity().findViewById(id.frage))
.setText(frage);


Wie kann ich das Objekt Fragentext oder Button ansprechen? :confused2:

##############################

Fehlermeldung:
08-26 20:54:09.650: E/AndroidRuntime(29709): FATAL EXCEPTION: main
08-26 20:54:09.650: E/AndroidRuntime(29709): java.lang.NullPointerException
08-26 20:54:09.650: E/AndroidRuntime(29709): at de.manuel.buchenfueranfaenger.Frage.anzeigen(Frage.java:28)


Fehler.JPG

Code:
package de.manuel.buchenfueranfaenger;

import android.app.Fragment;
import android.widget.Button;
import android.widget.TextView;
import de.manuel.buchenfueranfaenger.R.id;

class Frage {
	private String frage;
	private String option1;
	private String option2;
	private String option3;
	private String option4;
	private int loesung;

	public Frage(String f, String o1, String o2, String o3, String o4, int l) {
		frage = f;
		option1 = o1;
		option2 = o2;
		option3 = o3;
		option4 = o4;
		loesung = l;
	}

	public void anzeigen(Fragment quizActivity) {

		((TextView) quizActivity.getActivity().findViewById(id.frage))
				.setText(frage);
		((Button) quizActivity.getActivity().findViewById(id.antwort1))
				.setText(option1);
		((Button) quizActivity.getActivity().findViewById(id.antwort2))
				.setText(option2);
		((Button) quizActivity.getActivity().findViewById(id.antwort3))
				.setText(option3);
		((Button) quizActivity.getActivity().findViewById(id.antwort4))
				.setText(option4);

	}

	public boolean richtig(int ausgewaehlt) {
		if (ausgewaehlt == this.loesung)
			return true;
		else
			return false;
	}
}

Code:
package de.manuel.buchenfueranfaenger;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;


public class QuizActivity extends Fragment implements
		android.view.View.OnClickListener {
	Spiellogik spiel;

	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {

		View view = inflater.inflate(R.layout.activity_quiz, container, false);

		/*
		 * @Override public void onCreate(Bundle savedInstanceState) {
		 * super.onCreate(savedInstanceState);
		 * setContentView(R.layout.activity_quiz);
		 */

		// Spiellogik instanziieren
		spiel = new Spiellogik();

		// Antwort-Buttons mit Ereignislistener verbinden
		for (int n = 1; n <= 4; n++) {
			Button btn = null;

			switch (n) {
			case 1:
				btn = (Button) view.findViewById(R.id.antwort1);
				btn.setOnClickListener(this);
				break;
			case 2:
				btn = (Button) view.findViewById(R.id.antwort2);
				btn.setOnClickListener(this);
				break;
			case 3:
				btn = (Button) view.findViewById(R.id.antwort3);
				btn.setOnClickListener(this);
				break;
			case 4:
				btn = (Button) view.findViewById(R.id.antwort4);
				btn.setOnClickListener(this);
				break;
			}

		}

		// 1. Frage laden
		spiel.fragen[spiel.aktFrage].anzeigen(this);
		return view;
	}

	public void onClick(View v) {
		int id = v.getId();

		if (id == R.id.antwort1)
			spiel.auswerten(1, this); // spielAuswerten(1);
		else if (id == R.id.antwort2)
			spiel.auswerten(2, this); // spielAuswerten(2);
		else if (id == R.id.antwort3)
			spiel.auswerten(3, this); // spielAuswerten(3);
		else if (id == R.id.antwort4)
			spiel.auswerten(4, this); // spielAuswerten(4);
	}

}

Code:
package de.manuel.buchenfueranfaenger;

import android.app.Fragment;
import android.content.Context;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import de.manuel.buchenfueranfaenger.R.id;

class Spiellogik {
	final int ANZAHL_FRAGEN = 8;

	Frage[] fragen = new Frage[ANZAHL_FRAGEN];
	byte aktFrage = 0;
	int gewinnstufe = 0;

	Context context;

	Spiellogik() {
		// Fragen erzeugen

		/******** Disney *********/
		fragen[0] = new Frage("Wie heißt der kleine Berater Pinocchios?",
				"Jimmy, die Grille", "Jim Jarmusch", "Jiminiy Grille",
				"Jimmy, die Zikade", 3);
		fragen[1] = new Frage("Mit welchem Vogel fliegen Bernard und Bianca?",
				"Airbus", "Adler", "Taube", "Albatros", 4);
		fragen[2] = new Frage("Wer spricht den Albatros Orville?", "H. Juhnke",
				"D. Hallervorden", "B. Pastewka", "S. Raab", 1);
		fragen[3] = new Frage("Welcher Schauspieler spricht Prinz John?",
				"G. Fröbe", "H. Rühmann", "P. Ustinov", "Ch. Lee", 3);
		fragen[4] = new Frage(
				"Welches war der erste abendfüllende Disney-Film?",
				"Schneewittchen", "Fantasia", "Bambi", "Aristocats", 1);
		fragen[5] = new Frage("Wo lebt Peter Pan?", "Nummerland", "Kummerland",
				"Nimmerland", "Lummerland", 3);
		fragen[6] = new Frage("Was raucht Roger aus 101 Dalmatiner?",
				"Zigarette", "Gras", "Pfeife", "Zigarre", 3);
		fragen[7] = new Frage(
				"Welcher Disney-Film war der kommerziell erfolgreichste?",
				"Aristocats", "Bambi", "Tarzan", "Schneewittchen", 4);

	}

	void auswerten(int schalter, Fragment quizActivity) {

		if (!fragen[aktFrage].richtig(schalter)) { // falsch beantwortet
			if (gewinnstufe == 0) {

				Toast textToast = new Toast(context);
				LinearLayout toastLayout = new LinearLayout(context);
				toastLayout.setOrientation(LinearLayout.HORIZONTAL);
				TextView text = new TextView(context);
				text.setText("Leider nichts gewonnen.  :-(");
				toastLayout.addView(text);
				textToast.setView(toastLayout);
				textToast.setDuration(Toast.LENGTH_SHORT);
				textToast.show();

				/*
				 * Toast.makeText(quizActivity, "Leider nichts gewonnen.  :-(",
				 * Toast.LENGTH_LONG).show();
				 */
			} else {

				Toast textToast = new Toast(context);
				LinearLayout toastLayout = new LinearLayout(context);
				toastLayout.setOrientation(LinearLayout.HORIZONTAL);
				TextView text = new TextView(context);
				text.setText("Sie haben Gewinnstufe " + gewinnstufe
						+ " erreicht!  :-)  - Glückwunsch!!!");
				toastLayout.addView(text);
				textToast.setView(toastLayout);
				textToast.setDuration(Toast.LENGTH_SHORT);
				textToast.show();

				/*
				 * 
				 * String str = "Sie haben Gewinnstufe " + gewinnstufe +
				 * " erreicht!  :-)  - Glückwunsch!!!";
				 * Toast.makeText(quizActivity, str, Toast.LENGTH_LONG).show();
				 */

			}
			// Schalter deaktivieren

			((Button) quizActivity.getActivity().findViewById(id.antwort1))
					.setEnabled(false);
			((Button) quizActivity.getActivity().findViewById(id.antwort2))
					.setEnabled(false);
			((Button) quizActivity.getActivity().findViewById(id.antwort3))
					.setEnabled(false);
			((Button) quizActivity.getActivity().findViewById(id.antwort4))
					.setEnabled(false);

		} else {
			if (aktFrage < ANZAHL_FRAGEN - 1) {
				fragen[++aktFrage].anzeigen(quizActivity);

				gewinnstufe++;
				((ProgressBar) quizActivity.getActivity().findViewById(
						id.progressBar1)).setProgress(gewinnstufe);
			} else {
				gewinnstufe++;
				((ProgressBar) quizActivity.getActivity().findViewById(
						id.progressBar1)).setProgress(gewinnstufe);

				String str = "Super, Sie haben alles richtig beantwortet!!!";

				Toast textToast = new Toast(context);
				LinearLayout toastLayout = new LinearLayout(context);
				toastLayout.setOrientation(LinearLayout.HORIZONTAL);
				TextView text = new TextView(context);
				text.setText(str);
				toastLayout.addView(text);
				textToast.setView(toastLayout);
				textToast.setDuration(Toast.LENGTH_SHORT);
				textToast.show();

				/*
				 * Toast.makeText(quizActivity, str, Toast.LENGTH_LONG).show();
				 */

				// Schalter deaktivieren
				((Button) quizActivity.getActivity().findViewById(id.antwort1))
						.setEnabled(false);
				((Button) quizActivity.getActivity().findViewById(id.antwort2))
						.setEnabled(false);
				((Button) quizActivity.getActivity().findViewById(id.antwort3))
						.setEnabled(false);
				((Button) quizActivity.getActivity().findViewById(id.antwort4))
						.setEnabled(false);
			}
		}
	}
}
 
Hallo,
ich sehe nicht so richtig welche Klasse nun jetzt für die Gestaltung der UI gedacht ist - sehe den Code aber auch nur in Tapatalk und es ist früh am Morgen :p
Problematisch könnte deine anzeigen-Methode in Frage sein. Du bietest kein Objekt an, castest also aus dem Nichts. Vielleicht lässt sich die Frage-Klasse auch soweit "zurückzuschreiben", dass hier gar keine UI Elemente aufgerufen werden müssen.

Keine Gewähr :p
 
Die UI ist schon fertig und sieht wie folgt aus:

Code:
<LinearLayout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="10dp" >

    <TextView
        android:id="@+id/frage"
        android:layout_width="match_parent"
        android:layout_height="40sp"
        android:layout_marginBottom="5dp"
        android:text="@string/app_name"
        android:textStyle="bold" >
    </TextView>

    <TableLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
            <Button
                android:id="@+id/antwort1"
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:text="Button"
                android:textSize="6pt">
            </Button>
            <Button
                android:id="@+id/antwort2"
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:text="Button"
                android:textSize="6pt" >
            </Button>
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
            <Button
                android:id="@+id/antwort3"
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:text="Button"
                android:textSize="6pt" >
            </Button>

            <Button
                android:id="@+id/antwort4"
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:text="Button"
                android:textSize="6pt" >
            </Button>
        </TableRow>
    </TableLayout>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <ProgressBar
            android:id="@+id/progressBar1"
            style="@android:style/Widget.ProgressBar.Horizontal"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:max="8"
            android:progress="0" >
        </ProgressBar>

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="Erreichter Spielstand"
            android:textColor="#AAAAAA" >
        </TextView>
    </FrameLayout>

</LinearLayout>

Mit der folgenden Codezeile in der Klasse QuizAcitivity

spiel.fragen[spiel.aktFrage].anzeigen(this);

wird doch vom Objekt spiel (Klasse Spiellogik [die Frage übergeben]) das Objekt fragen (Klasse Fragen) aufgerufen und hierin die Methode anzeigen mit der Übergabe this = die Klasse QuizAcitivity, also das Fragment. Oder habe ich ein Denkfehler?
Leider funktioniert hier nicht so etwas wie:
public void anzeigen(Fragment quizActivity) {

((TextView) quizActivity.findViewById(id.frage)).setText(frage);

public void anzeigen(Fragment quizActivity) {

Ich habe aus reinem Unwissen das folgende ohne Erfolg probiert:

((TextView) quizActivity.getView().findViewById(id.frage)).setText(frage);

Ich frage mich nur wie ich an die TextView rankomme? :unsure:
 
Hmm, wie gesagt ich vermute der Fehler kommt durch das Nichtvorhandensein der TextView...

Probiere es mal so:
Code:
deineTextView = ((TextView) quizActivity.getView().findViewById(id.frage)).set  Text(frage);
(natürlich noch irgendwo in der Klasse "deineTextView" deklarieren) :)

Ggf. checkt das der Compiler nicht, dann halt zuerst das Objekt wie oben beschrieben initialisieren und dann im Anschluss manipulieren (zB Aufruf von setText(...))
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Manuel1805
Code:
((TextView) quizActivity.getActivity().findViewById(id.frage)).setText(frage);
Der View wird nicht gefunden, weil du an der falschen Stelle suchst. Mit getActivity() sucht du ein View im RootView deiner FragmentActivity. Der gesuchte View befindet sich aber im RootView des Fragmentes.

Wenn findViewById kein passenden View findet, ist der Rückgabewert null.

Die Lösung von ui_3k1 könnte funktionieren, wenn du deineTextView = weglässt. Die Methode getView() liefert den RootView des betreffenden Fragmentes zurück. Und dort befindet sich auch der gesuchte View.

Insgesamt ist Deine Lösung recht chaotisch. Wie schon ui_3k1 anmerkte, sollte nur eine Klasse für die GUI zuständig sein. So wie du den Code implementiert hast, ist der Code sehr unübersichtlich und langsam.
 
getActivity() sucht du ein View im RootView deiner FragmentActivity. Der gesuchte View befindet sich aber im RootView des Fragmentes
Diese Aussage ist nicht korrekt. Jedes Fragment wird von einer Aktivität gehalten und ist daher natürlich auch über die Aktivität ansprechbar. Probiere es aus!

Warum ist es hier dennoch null?

onCreateView erzeugt erst seine view. Es ist zu diesem Zeitpunkt noch nicht an die Aktivität gehangen.

Würdest du spiel.fragen[spiel.aktFrage].anzeigen(this); in onViewCreated schreiben, kann die Aktivität auch die views finden.
Allerdings ist das sinnloser Mehraufwand, da du das Layout des Fragments ja hast.

Wie ich aber auch sehe, hast du einen leeren Context in deiner Spiellogik rumfliegen. Da wird die nächste NullPointer auftreten.

Beschäftige dich mit dem Lifecycle von Aktivitäten und Fragmenten. Das ist wirklich sehr wichtig.

Wo ich mit den anderen übereinstimme ist, dass dieser Code wirklich wirklich schrecklich ist :p
 
tuppy schrieb:
Diese Aussage ist nicht korrekt. Jedes Fragment wird von einer Aktivität gehalten und ist daher natürlich auch über die Aktivität ansprechbar. Probiere es aus!

Diese Aussage ist ...
Das Fragment hält die direkte Referenz auf den View. Deshalb macht es schon Sinn den View direkt vom Fragment her aufzurufen.
Anders gesagt, du referenzierst erst vom Fragment auf die Activity, um dann wieder auf das gleiche Fragment zu referenzieren (Dabei muss du auch noch casten). Nach diesem Akt rufst dann den RootView des Fragment auf (getView()), um dann die Referenz auf den View zu erhalten.

Ich denke du magst Spagetti-Code. :) Und wenn du viel Pech hast hast du ein mehrfach referenziertes Objekt, welches dazu führt, dass der GC das Objekt nicht mehr aus den Speicher entfernen kann.

Eine andere Möglichkeit die mir auch gerade einfällt, wäre es den Baum des RootView der Activity nach einem View mit der Id id.frage zu durchsuchen. Eine sehr performante Lösung.

Noch etwas onCreatView(). Dort benutzt man Methode inflate(..). Spricht man kann das gleiche Layout mehrmals einbinden. Viel Spaß beim Suchen, wenn es mehrere Views mit der gleichen id gibt. (Noch ein Grund deine Lösung nicht auszuprobieren) ;)

Und vielleicht ist dir aufgefallen, dass in der Methode onCreateView() die Methode anzeigen(...) erst ausgeführt wird, nachdem das Layout erzeugt wurde. Sprich deine Aussage
onCreateView erzeugt erst seine view. Es ist zu diesem Zeitpunkt noch nicht an die Aktivität gehangen.
ist einfach nur falsch ist. Dies erschließt sich auch aus den Rudimenten der Fehlermeldung.

@tuppy, schnappe dir am besten mal ein gutes Javabuch, und arbeite es durch. ;)
 
Anders gesagt, du referenzierst erst vom Fragment auf die Activity, um dann wieder auf das gleiche Fragment zu referenzieren (Dabei muss du auch noch casten). Nach diesem Akt rufst dann den RootView des Fragment auf (getView()), um dann die Referenz auf den View zu erhalten.
Falsch. Views hängen am Context. Woran hängen Fragments? ohh. Casten wird (wie immer) auf den view type - spielt hier aber keine Rolle. Darüber hinaus meinte ich ja schon, dass es sinnloser Mehraufwand ist, über die Aktivität zu gehen. Lies alles bitte.

----

Nochmal, die Aktivität kennt die view noch nicht. Warum (keyword) return(ed) onCreateView wohl eine View? Was passiert also, wenn man mit (sinnloserweise) getActivity eine View in der im fragment erstellen view sucht?... NullPointer korrekt.

Was ist hier das eigentliche Problem? Umstellung von Aktivität auf Fragments ohne zu Wissen, was läuft. Dann kommt so ein Murks wie oben raus.

Und:

Wenn du mir am Ende schon so ein schlauen Spruch an den Kopf haust, sei dir sicher, dass du dir 100% im Klaren darüber bist, was du schreibst. So machst du dich einfach nur lächerlich :/
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Manuel1805
@tuppy Beim Nullpointer habe ich nicht aufgepasst, sorry. Ich habe übersehen, dass der View noch nicht zurückgeben wurde. Der Spruch tut mir leid :(

Deine Lösung macht aber trotzdem kein Sinn. Dein Problem ist, dass du glaubst das die Referenzen der Views identisch sind mit den id der Ressourcen.
Aber in der Android Referenze steht
HTML:
View IDs need not be unique throughout the tree, but it is good practice to ensure that they are at least unique within the part of the tree you are searching.
View | Android Developers

Wie du siehst ist die Sache ein bisschen komplexer.

Die ganze Soße (Layout) wird teilweise gemappt (XML). Anders gesagt, man sollte bei Zugriffen über die Ids sehr vorsichtig agieren. Es ist möglich ein View mit einer bestimmten id mehrmals in eine RootView zu benutzen. Theoretisch kann man im Layout des Fragment die gleichen Ids wie im ParentLayout der Activity benutzen. Nur wenn man den Tag <fragment ... > benutzt, müssen die Ids zwischen Parent und Child Views unterschiedlich sein. Denkbar wäre auch, dass man dass Fragment zweimal in der FragmentAktivity instanziiert.

Das heißt im Endeffekt, dass dein vorschlagender Weg nur dann funktioniert, wenn jede id wirklich nur einmal benutzt wird.
Wer will aber jedes Layout jedes mal mit neuen Ids implementieren, wenn man immer wieder das gleiche Layout benutzen kann. (Kapselung und Wiederverwendbarkeit - OOP).

Es macht einfach kein Sinn hier die Methode getActivity() zu benutzten. Du kannst zwar denn Baum deiner Views durchsuchen, aber du kannst Dir niemals sicher sein, dass du den richtigen View erwischt. ;) In einem größeren Projekt mit mehreren Entwickler kann es schon vorkommen, das Id mehrfach benutzt werden.

@Manuel1805. Im Endeffekt sieht der Code nicht schön aus. Strukturiere deinen Code. Normal sagt man, dass man gleiche Aufgaben in einer Methode bündeln soll. Am besten instanziierst du alle Views in onCreateViews und nicht an zwei Stellen.

Eine mögliche Lösung wäre, dass du dem Fragment ein Bundle mit den Fragen und Antworten übergibst, dann in Fragment die Lösung überprüfst. Und zu Schluß der FragmentActivity das Ergebnis zurückgibst (mit getActivity()).

https://developer.android.com/training/basics/fragments/communicating.html

----

Nachtrag:

Context ist eine abstrakte Klasse. Und sie hat eine ganze Menge an
Subklassen. Sprich Context definiert nur eine Schnittstelle. @tuppy, Du meinst wahrscheinlich die Klasse com.android.internal.os.ZygoteInit. Und auf
die kannst du leider nicht ohne weiteres zugreifen (Gekapselt). ;)
 
  • Danke
Reaktionen: Manuel1805
Hallo zusammen!
Vielen Dank für die vielen Hinweise und lehrreichen Informationen. Ich glaube, die von mir im Internet gefundenen Klassen werde ich ad acta legen und meine eigene Klassen für ein Quiz schreiben...dachte nur dass das Rad nicht zwei mal erfunden werden muss.
 
  • Danke
Reaktionen: ui_3k1
Hallo nochmal von meiner Seite.
Hehe, die Fragmente sind immer ein hitziges Thema :D
Ich habe das oben genannte Problem ehrlich gesagt nicht so wirklich auf dem Radar, bzw. gehe ich vielleicht komplett anders vor und würde dazu gerne wissen ob meine aktuelle Vorgehensweise unvorteilhaft, langsam, unsicher, (etc.) ist.

Bei mir sieht eine App, in der ich Fragmente anbiete, wie folgt aus:
1. In Main lade ich in onCreate alle Fragmente
1b. Layout von Main ist geladen, kommt in den Vordergrund
2. durch einen Drawer wird danach die jeweilige "Auswahl" in den Vordergrund geladen
3. weiter gehts in der onCreateView in der jeweiligen Fragment-Klasse

der Code dafür sieht dann so aus:
Code:
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (FAC.DEBUG) Log.d(this.getActivity().getLocalClassName() + "->" + TAG, "***onCreateView***");

        // AppHelper laden, er übernimmt die Steuerung der Bluetooth-Statusabfrage
        appHelper = new AppHelper(getActivity());

        // Aufruf über Main um Titel zu ändern
        ((ActivityMain) getActivity()).set_mTitle(getActivity().getString(R.string.title_s3_temperature));

        // View mit UI-Elementen laden
        final View layout = inflater.inflate(R.layout.flayout_temperature, null);
        tvHeader = (TextView) layout.findViewById(R.id.tv_temperature_header);
        tvBluetoothStatus = (TextView) layout.findViewById(R.id.tv_temperature_bt_status);
        tvData = (TextView) layout.findViewById(R.id.tv_temperature_data);
        btnConnect = (Button) layout.findViewById(R.id.btn_temperature_connect);
        btnConnect.setOnClickListener(this);

[...]

return layout;
Ich finde diese Herangehensweise super praktikabel, da sie bei mir nie zu größeren Problemen geführt hat und auch recht einfach zu verstehen ist.
Wie gesagt, was den Ressourcen-Verbrauch angeht, bin ich mir nicht sicher, ob der Weg der beste ist. Was meint ihr?
 
  • Danke
Reaktionen: markus.tullius
@markus
Entschuldigung akzeptiert. Hast ja Anstand bewiesen :D

Ich stimme mit dir vollkommen überein, dass es absolut sinnlos ist, über die Aktivität zu gehen (Mehrmals erwähnt). Es ist auch tatsächlich das erste mal, dass jemand diese "Idee" so präsentiert. Natürlich kommt es früher oder später zu genannten Problemen. Was man halt sofort erkennt ist, dass der Lernende die Grundlagen noch nicht erlangt hat. Daher glaube ich, dass es aus didaktischer Sicht wertvoller ist, wenn der Lernende in alle möglichen Fettnäpfchen tritt, als ihm den "besten" Weg zu präsentieren. Lernen durch Fehler ist sehr effektiv. Ich hatte nicht den Eindruck, dass es sich hier um Produktionscode handelt *g*



@ui_3k1
Zwei Dinge, die mir auffallen.
Code:
final View layout = inflater.inflate(R.layout.flayout_temperature, null);
Da sollte dir die IDE eigentlich den Zeigefinger ins Gesicht halten. Falls du eine benutzt.

Avoid passing null as the view root (needed to resolve layout parameters on the inflated layout's root element)
Das kann tatsächlich mal zu unschönen Resultaten führen.
Daher rate ich dir, solange du das parent kennst/hast, zu dem hier:

Code:
inflater.inflate(R.layout.flayout_temperature, container, false);
Wann hast du das parent nicht und "darfst" null nehmen? Z.B. bei einem AlertDialog mit custom view.

Das zweite ist mehr Designsache.
Dein setTitle sollte eigentlich von deiner Zentrale der Aktivität übernommen werden.
Mit Zentrale meine ich, deine "Wechsle Fragmente aus" Methode. Das macht es etwas sauberer.
Vor allem, weil diese Zeile auch ned so schön aussieht :D
 
  • Danke
Reaktionen: ui_3k1
@Manuel1805

Nicht aufgeben. Und du muss das Rad nicht 2x erfinden. Solange der Autor es erlaubt, darfst du den Code natürlich benutzen. Ich kenne niemanden, der es nicht so macht. Du solltest Dir nur die Mühe machen, den benutzten Programmcode zu verstehen.
Fragmente ist so ein Thema für sich. Sie erschließen sich nicht von selbst. Nicht aufgeben. Ich glaube, kein Entwickler ist sich so wirklich sicher, ob er die Fragmente richtig implementiert. Googles Doku ist da ein bisschen chaotisch.

Schau trotzdem immer als ersten bei Google nach:

https://developer.android.com/training/basics/fragments/index.html

Hoffe wir konnten dir trotzdem helfen, nachdem die Diskussion ein bisschen ausgeartet ist.

@ui_3k1

Du solltest dich mehr an der Doku von Google orientieren, die Methode inflater.inflate(R.layout.flayout_temperature, container, false) ist die bessere Lösung.
Wobei ich dich ein bisschen in Schutz nehmen muss. Diese nervige Lint-Meldung
Avoid passing null as the view root (needed to resolve layout parameters on the inflated layout's root element)
wird ja noch nicht so lange angezeigt. Und viele alten Entwickler setzen das root view gerne null.
Die Ausnahme für das DialogFragment gibt es nicht. Fragment bleibt Fragment.
DialogFragment | Android Developers

Die Methode setTitle() auszulagern ist Geschmackssache. Ich würde es nicht machen, da man ein Fragment auch mit den XML - Tag <fragment ... > einfügen kann. Nicht jeder benutzt ein FragmentManager.
Ich würde vielleicht nur ein try and catch - Block herum setzen. Der View könnte null sein.

@tuppi

Eigentlich ist hier keiner ein Didaktiker, die meisten versuchen nur zu helfen. Mehr oder weniger schlecht, und wie man Zeit hat. Über den Ton lässt sich manchmal reden. ;)
Und keiner gibt hier perfekte Antworten. Aber denn meisten macht es Spaß. Insbesondere lernt man auch neue Sachen. Man sieht andere Lösungswege.

Warum ich geantwortet habe, ist relativ einfach. Du bewegst dich hier auf sehr dünnen Eis. Das merkt man an Deinen Antworten. Ich schätze, du programmierst noch nicht so lange Android oder Java. Wenn Du Dir nicht sicher bist, schau bitte zuerst in der Doku nach. Zur Zeit produzierst Du für jede richtige Antwort zwei falsche.
 
  • Danke
Reaktionen: ui_3k1
markus.tullius schrieb:
Du solltest dich mehr an der Doku von Google orientieren

Wohl war. Ich ertappe mich immer wieder selbst bei Sachen, die sehr grundlegend sind und dann doch super neu für mich erscheinen (konkretes Beispiel: ich habe erst dieser Tage den Broadcast-Receiver kennengelernt).
Trotzdem muss ich ehrlich gestehen, dass mir das Nachlesen in der Doku nicht die allergrößte Freude macht. :p
 
Da bist du nicht der einzige. Ich bin immer wieder überrascht, wie schnell sich alles ändert. Und es gibt so viele Bereiche, die man gerne machen möchte, aber dafür keine Zeit hat. Ich bin letzten über Daydream gestolpert. Mal sehen, wann ich dazu komme. ;)
 

Ähnliche Themen

D
Antworten
23
Aufrufe
2.527
Data2006
D
M
Antworten
2
Aufrufe
863
jogimuc
J
OnkelLon
Antworten
13
Aufrufe
1.980
OnkelLon
OnkelLon
Zurück
Oben Unten