Quiz App- Fragen speichern und mit Buttons u. TextView verbinden

  • Antworten:15
  • Bentwortet
Syntac Moore
  • Forum-Beiträge: 44

02.01.2014, 16:38:51 via Website

Hey,
Ich versuche mich grade an meiner ersten App. In der Schule haben wir schon etwas gemacht aber leider hilft mir das bei meinem Problem nicht weiter.
Ich möchte eine Quiz App erstellen. Bis jetzt hab ich den StartScreen mit zwei Buttons (Highscore und Play), wenn man Play drückt gelangt man zu den 4 Schwierigkeitsstufen. Ich möchte jetzt zu jeder Schwierigkeitsstufe Fragen speichern. Ich will das es immer nur ein Layout gibt mit 4 Buttons (Antwortmöglchkeiten) und ein TextView (Frage), soweit hab ich das auch schon. Wie erstelle ich jetzt eine Liste, die praktisch 5 Strings besitzt, ein String für die Frage und 4 für die Buttons? Ich bin mir auch nicht sicher wie ich das genau mit der Oberfläche verbinden soll. Ich will, dass wenn ich die richtige Antwort drücke, ich glaub dazu sollte ich auch eine Liste erschaffen. Dann kann ich irgenwdie überprüfen ob Antwort die geklickt wurde und richtige Antwort übereinstimmen.

Hoffe ihr versteht ungefähr was ich meine :D

Antworten
Phil G.
  • Forum-Beiträge: 86

02.01.2014, 16:53:52 via Website

Wie erstelle ich jetzt eine Liste, die praktisch 5 Strings besitzt, ein String für die Frage und 4 für die Buttons?

Naja du musst Dir einfach eine Struktur bauen, welche diesem Muster entspricht. zum Beispiel

1public class Quizfrage {
2
3 private String frage;
4 private String antwort0;
5 private String antwort1;
6 private String antwort2;
7 private String antwort3;
8 private int loesung;
9 private int schwierigkeit;
10
11 creator und getter und setter dann ab hier ...

Die nächste Schwierigkeit wie kommen die Fragen in die APP, du kannst hier zum Beispiel eine SQLite Datenbank nutzen, ein Textfile oder auch eine XML-Datei.
Wenn du jetzt deine Fragen am PC pflegen möchtest bzw. du ein schneller Ergebnis haben willst (ohne Dir jetzt erst einmal groß Datenbanktools zu beschaffen). Dann würde ich Dir erst einmal zur XML Lösung raten, das geht schnell und du kannst das System später noch verfeinern.

Ein mögliche XML könnte folgende Struktur haben:

1<qf>
2<f>Wie nennt man die Person, welche an Weihnachten die Geschenke bringt?</f>
3<a1>Nikolaus</a1>
4<a2>Weihnachtsmann</a2>
5<a3>Geschenkeheinz</a3>
6<a4>Ronald McDonald</a4>
7<l>2</l>
8<dif>1</dif>
9</qf>

f = frage
a1-a4 Antowrtmöglichkeiten
l = Lösung
dif - die Schwierigkeitsstufe

Der Vorteil - die XML kannst du erst einmal direkt als Resource einbinden und Dir ganz fix ein paar Testfragen generieren.
In deiner App brauchst du jetzt nur noch die XML-Datei auszulesen (XML - Pullparser oder SAX oder wie auch immer)
-> die Fragen in deine Struktur übertragen (zb Arraylist) -> und schon kannst du bequem damit arbeiten.

Ich bin mir auch nicht sicher wie ich das genau mit der Oberfläche verbinden soll.

-> du musst Dir nur noch einen Quizalgorithmus überlegen -> also Endlosmodus oder bestimmte Anzahl von Fragen (Wer wird Millionär)
naja und dann baust du Dir deinen Gameloop.

Quiz gestartet -> per Zufall Frage aus der Arraylist holen (Wert auch noch zwischenspeichern um Doppelungen bei den Fragen auszuschliessen)
-> Texte der Frage und Texte der Buttons ändern -> Auf User Eingabe warten

-> Antwort falsch -> User zeigen das Frage falsch -> Spiel vorbei /
-> Antwort richtig -> User zeigen das Frage richtig -> Punkte addieren -> nächste Frage holen -> weiter wie oben.

Tja und der Rest sind Feinheiten...

Antworten
impjor
  • Forum-Beiträge: 1.793

02.01.2014, 20:16:47 via App

Phil G.
Quiz gestartet -> per Zufall Frage aus der Arraylist holen (Wert auch noch zwischenspeichern um Doppelungen bei den Fragen auszuschliessen)
Bei einer ArrayList einfach mit remove() die gewählte Frage entfernen, damit sie nicht noch einmal gewählt wird.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Syntac Moore
  • Forum-Beiträge: 44

09.01.2014, 15:01:02 via Website

Ich hab jetzt mal Teile aus einem Quiz Beispiel aus einem Buch genommen und versucht bei mir einzubauen, klappt aber irgendwie nicht. Hab dann versucht das ganze Beispiel aus dem Buch nachzuprogrammierenm aber geht auch nicht. Könnt ich einem von euch vllt. das Projekt schicken?
grüße,
Syntac

Antworten
impjor
  • Forum-Beiträge: 1.793

09.01.2014, 17:22:28 via App

Sorry, wenn das jetzt hart klingt, aber warum sollte sich jemand die Mühe machen ein Projekt in eclipse zu importieren, sich in fremden Code einzulesen und einen undefinierten Fehler zu finden, wo du nicht einmal genau herausgefunden hast, wo bzw. was der Fehler ist.
Beschreibe doch ersteinmal was *konkret* nicht funktioniert.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

San Blarnoi

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

09.01.2014, 19:49:10 via Website

@Impjor: Hast Recht wir betreiben keinen Privaten Support, außerdem gibt es hier ein Forum indem wir alles klären können.

Bitte beschreibe dein Problem genau.
Was funktioniert nicht?
Wie sieht dein Code aus?
Was zeigt LogCat?
Programmier oder Logik fehler?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Syntac Moore
  • Forum-Beiträge: 44

09.01.2014, 22:39:54 via Website

Ja das verstehe ich.
Also gut, kennt ihr das Buch "Jetzt lerne ich Android"? Dort gibt es ein Quiz Beispiel. Ich hab versucht das nach zubauen aber bis jetzt ohne Erfolg.
Das Problem liegt erstmal in der Activity Class. Aus irgendeinem Grund wird das "n" im Switch als Fehler markiert. Wenn ich die Variable dann instanziere ist der Fehler weg aber die App lässt sich nicht starten. Wenn mir einer sagen kann wie man den Fehler aus dem LogCat kopiert, stelle ich ihn gerne hier rein.

Das ist der Code meiner MainActivity:
1package de.versuch;
2
3import android.app.Activity;
4import android.os.Bundle;
5import android.view.View;
6import android.widget.Button;
7public class Quiz extends Activity
8implements android.view.View.OnClickListener {
9 Spiellogik spiel;
10
11 @Override
12 public void onCreate(Bundle savedInstanceState) {
13 super.onCreate(savedInstanceState);
14 setContentView(R.layout.activity_quiz);
15
16 // Spiellogik instanzieren
17 spiel = new Spiellogik();
18 // Antwort-Buttons mit Ereignislistener verbinden
19 for (int n = 1; n <= 4; n++) {
20 Button btn = null;
21 }
22
23
24 switch (n) {
25 case 1:
26 Button btn = (Button) this.findViewById(R.id.antwort1);
27 btn.setOnClickListener(this);
28 break;
29 case 2:
30 btn = (Button) this.findViewById(R.id.antwort2);
31 btn.setOnClickListener(this);
32 break;
33 case 3:
34 btn = (Button) this.findViewById(R.id.antwort3);
35 btn.setOnClickListener(this);
36 break;
37 case 4:
38 btn = (Button) this.findViewById(R.id.antwort4);
39 btn.setOnClickListener(this);
40 break;
41 }
42}
43 // 1. Frage laden
44
45
46 public void onClick(View v) {
47 int id = v.getId();
48 if (id == R.id.antwort1)
49 spiel.auswerten(1, this);
50 // spielAuswerten(1);
51 else if (id == R.id.antwort2)
52 spiel.auswerten(2, this);
53 // spielAuswerten(2);
54 else if (id == R.id.antwort3)
55 spiel.auswerten(3, this);
56 // spielAuswerten(3);
57 else if (id == R.id.antwort4)
58 spiel.auswerten(4, this);
59 // spielAuswerten(4);
60 }
61 }
Ich weiß nicht ob für den Fehler die Hilfsklassen mit Schuld haben, aufjedenfall hier sind sie.
Code der Hilfsklasse Frage:
1package de.versuch;
2
3import android.app.Activity;
4import android.widget.Button;
5import android.widget.TextView;
6
7class Frage {
8 private String frage;
9 private String option1;
10 private String option2;
11 private String option3;
12 private String option4;
13 private int loesung;
14
15 public Frage(String f,
16 String o1, String o2, String o3, String o4,
17 int l) {
18 frage = f;
19 option1 = o1;
20 option2 = o2;
21 option3 = o3;
22 option4 = o4;
23 loesung = l;
24 }
25 public void anzeigen(Activity quizActivity) {
26 ((TextView) quizActivity.findViewById(R.id.frage)).setText(frage);
27 ((Button) quizActivity.findViewById(R.id.antwort1)).setText(option1);
28 ((Button) quizActivity.findViewById(R.id.antwort2)).setText(option2);
29 ((Button) quizActivity.findViewById(R.id.antwort3)).setText(option3);
30 ((Button) quizActivity.findViewById(R.id.antwort4)).setText(option4);
31 }
32
33 public boolean richtig(int ausgewaehlt) {
34 if (ausgewaehlt == this.loesung)
35 return true;
36 else
37 return false;
38 }
39 }
Und das der Hilfsklasse Spiellogik:
1package de.versuch;
2
3import android.app.Activity;
4import android.widget.Button;
5import android.widget.ProgressBar;
6import android.widget.Toast;
7
8class Spiellogik {
9 final int ANZAHL_FRAGEN = 8;
10
11 Frage[] fragen = new Frage[ANZAHL_FRAGEN];
12 byte aktFrage = 0;
13 int gewinnstufe = 0;
14 Spiellogik() {
15 // Fragen erzeugen
16 fragen[0] =
17 new Frage("Wie heißt der kleine Berater Pinocchios?",
18 "Jimmy, die Grille", "Jim Jarmusch",
19 "Jiminiy Grille", "Jimmy, die Zikade", 3);
20
21 fragen[1] =
22 new Frage("Mit welchem Vogel fliegen Bernard und Bianca?",
23 "Airbus", "Adler", "Taube", "Albatros", 4);
24
25 // und so fort
26 }
27 void auswerten(int schalter, Activity quizActivity) {
28
29 if (!fragen[aktFrage].richtig(schalter)) {
30 // falsche Antwort
31 if (gewinnstufe == 0) {
32 Toast.makeText(quizActivity,
33 "Leider nichts gewonnen. :-(",
34 Toast.LENGTH_LONG).show();
35 }
36 else {
37 String str = "Sie haben Gewinnstufe " + gewinnstufe +
38 " erreicht! :-) - Glückwunsch!!!";
39 Toast.makeText(quizActivity, str,
40 Toast.LENGTH_LONG).show();
41 } // Schalter deaktivieren
42 ((Button) quizActivity.findViewById(R.id.antwort1)).setEnabled(false);
43 ((Button) quizActivity.findViewById(R.id.antwort2)).setEnabled(false);
44 ((Button) quizActivity.findViewById(R.id.antwort3)).setEnabled(false);
45 ((Button) quizActivity.findViewById(R.id.antwort4)).setEnabled(false);
46
47 }
48 else {
49 if (aktFrage < ANZAHL_FRAGEN-1) {
50 fragen[++aktFrage].anzeigen(quizActivity);
51
52 gewinnstufe++;
53 ((ProgressBar) quizActivity.findViewById(
54 R.id.progressBar1)).setProgress(gewinnstufe);
55 }
56 else {
57 gewinnstufe++;
58 ((ProgressBar) quizActivity.findViewById(
59 R.id.progressBar1)).setProgress(gewinnstufe);
60 String str = "Super, Alles richtig beantwortet!!!";
61 Toast.makeText(quizActivity, str,
62 Toast.LENGTH_LONG).show();
63 // Schalter deaktivieren
64 ((Button) quizActivity.findViewById(R.id.antwort1)).setEnabled(false);
65 ((Button) quizActivity.findViewById(R.id.antwort2)).setEnabled(false);
66 ((Button) quizActivity.findViewById(R.id.antwort3)).setEnabled(false);
67 ((Button) quizActivity.findViewById(R.id.antwort4)).setEnabled(false);
68
69 }
70 }
71 }
72 }
Und zu guter letzt das Layout:
1<LinearLayout xmlns:android="://schemas.android.com/apk/res/android"
2 android:layout_width="match_parent"
3 android:layout_height="match_parent"
4 android:orientation="vertical" >
5
6 <TextView
7 android:id="@+id/frage"
8 android:layout_width="match_parent"
9 android:layout_height="wrap_content"
10 android:text="@string/app_name" >
11 </TextView>
12
13 <TableLayout
14 android:layout_width="wrap_content"
15 android:layout_height="wrap_content" >
16
17 <TableRow
18 android:layout_width="match_parent"
19 android:layout_height="wrap_content" >
20
21 <Button
22 android:id="@+id/antwort1"
23 android:layout_width="150dp"
24 android:layout_height="wrap_content"
25 android:text="Button" >
26 </Button>
27
28 <Button
29 android:id="@+id/antwort2"
30 android:layout_width="150dp"
31 android:layout_height="wrap_content"
32 android:text="Button" >
33 </Button>
34 </TableRow>
35
36
37 <TableRow
38 android:layout_width="match_parent"
39 android:layout_height="wrap_content" >
40
41 <Button
42 android:id="@+id/antwort3"
43 android:layout_width="150dp"
44 android:layout_height="wrap_content"
45 android:text="Button" >
46 </Button>
47
48 <Button
49 android:id="@+id/antwort4"
50 android:layout_width="150dp"
51 android:layout_height="wrap_content"
52 android:text="Button" >
53 </Button>
54 </TableRow>
55 </TableLayout>
56
57 <ProgressBar
58 android:id="@+id/progressBar1"
59 style="@android:style/Widget.ProgressBar.Horizontal"
60 android:layout_width="match_parent"
61 android:layout_height="wrap_content"
62 android:max="8"
63 android:progress="0" >
64 </ProgressBar>
65
66</LinearLayout>

Danke das ihr euch Zeit nehmt mir zu helfen

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

09.01.2014, 23:22:36 via App

n wird unterstrichen da sie in diesem bereich nicht deklariert ist. die schleifen klammer darf nach dem erzeugen des Button objektes nicht zu gehen.Musst du weiter nach unten verschieben.

— geändert am 09.01.2014, 23:24:36

LG Pascal //It's not a bug, it's a feature. :) ;)

Syntac Moore

Antworten
SvenDD
  • Forum-Beiträge: 272

10.01.2014, 08:02:19 via Website

1Button btn = null;
221 }
322
423
524 switch (n) {
625 case 1:

Setze die 21: } ans Ende der Schleife ...

— geändert am 10.01.2014, 08:02:31

Syntac Moore

Antworten
Syntac Moore
  • Forum-Beiträge: 44

10.01.2014, 23:02:03 via Website

So ich habe jetzt die Klammer ans Ende der Schleife verschoben, der Fehler mit dem "n" ist weg. Danke dafür :)
Aber wenn ich die App starte kommt wieder ein Fehler.
Das ist was mir das LogCat sagt.

01-10 21:58:18.922: D/AndroidRuntime(277): Shutting down VM
01-10 21:58:18.952: W/dalvikvm(277): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
01-10 21:58:18.992: E/AndroidRuntime(277): FATAL EXCEPTION: main
01-10 21:58:18.992: E/AndroidRuntime(277): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{de.versuch/de.versuch.QuizActivity}: java.lang.ClassNotFoundException: de.versuch.QuizActivity in loader dalvik.system.PathClassLoader[/data/app/de.versuch-1.apk]
01-10 21:58:18.992: E/AndroidRuntime(277): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
01-10 21:58:18.992: E/AndroidRuntime(277): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
01-10 21:58:18.992: E/AndroidRuntime(277): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
01-10 21:58:18.992: E/AndroidRuntime(277): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
01-10 21:58:18.992: E/AndroidRuntime(277): at android.os.Handler.dispatchMessage(Handler.java:99)
01-10 21:58:18.992: E/AndroidRuntime(277): at android.os.Looper.loop(Looper.java:123)
01-10 21:58:18.992: E/AndroidRuntime(277): at android.app.ActivityThread.main(ActivityThread.java:4627)
01-10 21:58:18.992: E/AndroidRuntime(277): at java.lang.reflect.Method.invokeNative(Native Method)
01-10 21:58:18.992: E/AndroidRuntime(277): at java.lang.reflect.Method.invoke(Method.java:521)
01-10 21:58:18.992: E/AndroidRuntime(277): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-10 21:58:18.992: E/AndroidRuntime(277): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-10 21:58:18.992: E/AndroidRuntime(277): at dalvik.system.NativeStart.main(Native Method)
01-10 21:58:18.992: E/AndroidRuntime(277): Caused by: java.lang.ClassNotFoundException: de.versuch.QuizActivity in loader dalvik.system.PathClassLoader[/data/app/de.versuch-1.apk]
01-10 21:58:18.992: E/AndroidRuntime(277): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
01-10 21:58:18.992: E/AndroidRuntime(277): at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
01-10 21:58:18.992: E/AndroidRuntime(277): at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
01-10 21:58:18.992: E/AndroidRuntime(277): at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
01-10 21:58:18.992: E/AndroidRuntime(277): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
01-10 21:58:18.992: E/AndroidRuntime(277): ... 11 more

— geändert am 10.01.2014, 23:02:35

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.01.2014, 11:25:48 via App

Android kann deine Main nicht instanzieren irgend eine Klasse wird nicht gefunden.

— geändert am 11.01.2014, 11:26:02

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Syntac Moore
  • Forum-Beiträge: 44

11.01.2014, 18:51:32 via Website

Und was genau lässt sich jetzt da machen um den Fehler zu beheben? Projekt einfach neu erstellen? Die Main löschen und neu programmieren?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.01.2014, 12:36:29 via Website

Ne, einfach mal schauen warum eine Klasse fehlt,
vlt. wegen keinem Import oder einbinden ins Projekt.
01-10 21:58:18.992: E/AndroidRuntime(277): Caused by: java.lang.ClassNotFoundException: de.versuch.QuizActivity in loader dalvik.system.PathClassLoader[/data/app/de.versuch-1.apk]

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Phil G.
  • Forum-Beiträge: 86

12.01.2014, 16:05:35 via Website

Vielleicht ist die Activity auch nicht im Manifest Deklariert ...

Antworten
Syntac Moore
  • Forum-Beiträge: 44

13.01.2014, 17:28:55 via Website

1<?xml version="1.0" encoding="utf-8"?>
2<manifest xmlns:android="schemas.android.com/apk/res/android"
3 package="de.versuch"
4 android:versionCode="1"
5 android:versionName="1.0" >
6
7 <uses-sdk
8 android:minSdkVersion="8"
9 android:targetSdkVersion="18" />
10
11 <application
12 android:allowBackup="true"
13 android:icon="@drawable/ic_launcher"
14 android:label="@string/app_name"
15 android:theme="@style/AppTheme" >
16 <activity
17 android:name="de.versuch.QuizActivity"
18 android:label="@string/app_name" >
19 <intent-filter>
20 <action android:name="android.intent.action.MAIN" />
21
22 <category android:name="android.intent.category.LAUNCHER" />
23 </intent-filter>
24 </activity>
25 </application>
26
27</manifest>

Das wär das Manifest.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

13.01.2014, 21:14:56 via App

Da ists drin aber das hättest du auch selber nachschauen können. sind die imports alle richtig?
Debugge mal die Komplette Anwendung dann kannst du Feststellen wo der Fehler ligt.

— geändert am 13.01.2014, 21:16:55

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten