Doppelte Switch case Anweisung mit zwei Checkboxxen

  • Antworten:24
Parasite
  • Forum-Beiträge: 56

05.07.2018, 11:22:02 via Website

Hallo, ich entwickle ein Quiz und hab zurzeit das folgende Problem:

Ich möchte das man eine Checkbox anklicken kann und so entscheidet ob die Fragen nach der Rheienfolge der Liste kommt oder per Zufall. Ich hab hier im Beispiel jetzt nur 2 Antwort Buttons, obwohl es 4 gibt, zu Faul zum schreiben ;)

@Override
public void onClick(View view) {

boolean checked = ((CheckBox) view).isChecked();

switch (view.getId()) {
case R.id.checkBoxliste:

            if (checked) {

                fragenLaden();


                switch (view.getId()) {
                    case R.id.button1:

                 if (frageAuswerten(Button1.getText().toString())) {
                punkte++;

            }else{

fragenLaden();
}
break;

case R.id.button2:

                 if (frageAuswerten(Button2.getText().toString())) {
                punkte++;

            }else{

fragenLaden();
}
break;
}
}

switch(view.getId()) {
case R.id.checkBoxrandom:

               if (checked) {

                   fragenLadenrandom();

                   switch (view.getId()) {
                       case R.id.button1:


                           if (frageAuswertenliste(Button1.getText().toString())) {
                               punkte++;

}else{

fragenLaden();
}
break;

case R.id.button2:

                 if (frageAuswerten(Button2.getText().toString())) {
                punkte++;

            }else{

fragenLaden();
}
break;
}
}

private boolean frageAuswertenliste(String btnText) {
boolean frage = false;
Array fragenC = new Array();
ArrayList GeoFrage = fragenC.getArray();
String[] speichergeo = GeoFrage.get(aktuelleFrageliste);

    if (speichergeo[1].equals(btnText)) {


        frage = true;
    }

private boolean frageAuswertenrandom(String btnText) {
boolean frage = false;
Array fragenC = new Array();
ArrayList GeoFrage = fragenC.getArray();
String[] speichergeo = GeoFrage.get(aktuelleFragerandom);

    if (speichergeo[1].equals(btnText)) {


        frage = true;
    }

Mein Problem ist das er nachdem ich eine Frage gecklickt habe die App schließt, er läd keine neue Frage, vielleicht kommt er in einen Loop und hängt sich so auf, ich weiß es nicht. Wenn mir jemand helfen kann , jemand einen Fehler erkennt, gerne. Es ist nicht der ganze Code, nur Beispielhaft dargestellt wie es funktionieren soll.

Die Fragen werden aus ner Arraylist geladen, aktuelleFrageliste und aktuelleFragerandom sind int Variablen um die Fragen aus der Arraylist zu laden.

Kommentieren
Parasite
  • Forum-Beiträge: 56

05.07.2018, 13:39:13 via Website

Ich möchte das haben:

public void onClick(View view) {

if (CheckBox.isChecked()) {

switch

case1:
if()
if()
else
break;

case2:
if()
if()
else
break;

case3:
if()
if()
else
break;

case4:
if()
if()
else
break;

if (CheckBox2.isChecked()) {

switch

case1:
if()
if()
else
break;

case2:
if()
if()
else
break;

case3:
if()
if()
else
break;

case4:
if()
if()
else
break;

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.07.2018, 13:50:18 via App

Bekommst du einen Fehler im LogCat?
Wenn ja welcher?

Wenn du dir deine Daten in Objekten ablegst, wird das ganze übersichtlicher und strukurierter.
Zudem fallen etliche String vergleiche weg.

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

Hilfreich?
Kommentieren
Parasite
  • Forum-Beiträge: 56

05.07.2018, 14:56:04 via Website

Was meinst du mit Daten in Objekten?
Fragen werden bei mir aus ner Arraylist gezogen.

Ich hab es auch jetzt so einigermaßen hinbekommen, Ich hab auf jeden Fall jetzt nicht mehr das Problem das er Stoppt, die Fragen werden geladen :)

Hab es mit zwei int Variablen gemacht die bei checked(Checkbox1 bzw. Checkbox2) ++ machen und if(int1 >o) soll er dan Anweisung zufällig oder halt if(int2>0) Anweisung nach Liste abrufen machen.

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.07.2018, 15:00:02 via App

Schau dir mal OOP an, das hilft vielleicht.
Googe nach java objekte Grundlagen

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

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

05.07.2018, 20:30:47 via Website

Hi ich muss Pascal schon beipflichten dein Programmier Stiel ist schon etwas sonderbar. Innerhalb einer switch(view.getId()) machst du das gleiche Switsh immer wieder.

Hilfreich?
Kommentieren
Parasite
  • Forum-Beiträge: 56

05.07.2018, 21:13:00 via Website

Ich hab das aus Spaß angefangen und weiter gemacht und ich hab gedacht mir kann hier vielleicht jemand helfen ;)

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.07.2018, 21:20:23 via Website

Helfen schon und unser erster Ansatz ist, dass du lernst, ordentlichen Code zu schreiben.
Da hilft, es Tutorials durch zu gehen (am besten auf Englisch) und fremden Code zu lesen.

Vorschlag wie es (fast) ohne switch geht:
damit spartst du dir viele Zeilen code indem du das ohne Fallunterschediung machst, sondern die Button über die ID neu lädst:

boolean checked = ((CheckBox) view).isChecked();


            if (checked && findViewByI(view.getId()) instanceof Button ) {
                fragenLaden();
                Button currButton = findViewById(view.getId()); //aktuellen Button finden
                 if (frageAuswerten(currButton.getText().toString())) {
                punkte++;
            }else{
                       fragenLaden();
                    } 
             }

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

Hilfreich?
Kommentieren
Parasite
  • Forum-Beiträge: 56

05.07.2018, 23:35:47 via Website

Hab das ja so ungefähr, das mit boolean hat nicht funktioniert, aber hab es jetzt hinbekommen, es läuft :)

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

06.07.2018, 08:31:11 via Website

Schön das du es geschafft hast.
Aber dein Code und der von Pascal sind schon verschieden. Da ist das ungefähr schon sehr weit hergeholt.
Du musst dich hier auch nicht rechtfertigen oder verteidigen. Nimm einfach die Hilfe an.

.

Hilfreich?
Pascal P.
Kommentieren
Parasite
  • Forum-Beiträge: 56

06.07.2018, 08:47:17 via Website

Es geht nicht um Hilfe annehmen, ich hab das schon so wie pascal meint, das was ich hier reingeschrieben habe war nur beispielhaft wie ich das haben wollte, ich wollte wissen ob das überhaupt so funktioniert aber ich schreib doch nicht meinen ganzen Code hier rein.

Das war nur beispielhaft!!!!
So kann man doch nicht Code schreiben, das compiliert der doch gar nicht!!!
Ich nehme Hilfe immer gerne an, aber ich hab immer das Gefühl die Leute sind zu Faul, so wie pascal halt. Ich bekomme immer nur so antworten: “gucke dir das an oder gucke dir das an. Aber konkrete Lösungsvorschläge bringt nie jemand. Das nicht die Art von Hilfe die ich suche.
Ich kann auch sagen, guck dir Arrays oder Objektorientiertes Programmieren an, das kann jeder aber helfen tut das nicht.

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.07.2018, 09:19:08 via App

Aus deiner Frage und deinem implementieren Beispielcode im 1. Post habe ich geschlossen, dass dir Grundlagen fehlen, da du dir eine Struktur mit Fragen und die Abfrage der Buttons so komplex aufbaust.
Und so eine switch Struktur wie du sie haben wolltest, geht technisch vermutlich auch irgendwie, aber das wäre unübersichtlich und unintuitiv, daher bin ich da auch nicht näher darauf eingegangen.
Außerdem kann man ja aufzeigen, wie man das deutlich einfacher machen kann, die meisten Freuen sich dann, dass sie nicht so viel Code haben...

Im ersten Schritt kannst du z.b. eine passende Frage/Antwort Struktur aufbauen, hier mal ein Vorschlag:
https://www.nextpit.de/forum/774546/app-stuerzt-bei-klick-auf-button-ab/page/1#3182830

Außerdem hab ich ja schon einen vereinfachungs Ansatz geschrieben ;)

— geändert am 06.07.2018, 09:25:52

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

Hilfreich?
Kommentieren
Parasite
  • Forum-Beiträge: 56

06.07.2018, 09:30:42 via Website

Ich glaube ihr habt gar nicht verstanden was ich wollte, vielleicht hab ich das blöd erklärt. Pascals letzte antwort mit code das war hilfreich aber so ähnlich hab ich das ja, nur mit mehr if anweisungen, weil ich mehr brauche!!.Aber der Code oben war nicht für einen oder zwei Buttons es ging da nicht nur um die checkboxen, das war nur Beispielhaft. Ich hab insgesamt 6 Buttons, vier antwort buttons, zwei checkbox und ich hab ne frageAuswerten und frageLaden method. Die auch damit eingefloßen sind.

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.07.2018, 09:48:57 via App

Dann beschreib mal was du allgemein tun willst, dann kann ich dir hier besser weiterhelfen.
was genau sollen deine Checkboxen und auswertungsmehtoden tun

— geändert am 06.07.2018, 09:50:15

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

Hilfreich?
Kommentieren
Parasite
  • Forum-Beiträge: 56

06.07.2018, 09:58:27 via Website

Was ich allgemein tun will ist eine Art quiz zu entwickeln, das heißt s gibt ein TextView auf das die Frage kommt und 4 Antwort Buttons mit antworten. Eine Textview das die Punkte Anzeigt plus die zwei checkboxxen, für Fragen zufällig oder nach Liste machen. Aber das mit den Checkboxen funktioniert ja jetzt. Vielleicht kannst du mir woanders bei helfen. Sagen wir mal ich hab 20 Fragen im Array und ich möchte jetzt das wenn eine Frage 1 oder 2xmal richtig beantwortet wurde(das wird mit Frageauswerten (method) bewerkstelligt), das die Frage blockiert bzw. Removed wird und bis zum neustart des programms nicht wieder auftaucht. Da ist nur das problem das wenn man jetzt im array index 3 löscht, das index4 auf index3 rutscht und er sich nicht mehr die richrige Frage bei mir holt. Ein remove Beispiel wäre schon gut 😊

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.07.2018, 10:13:24 via App

Das Problem lässt sich besser lösen, wenn du statt einem Array eine ArrayList nimmst.

Da hast du eine get(index)
und eine remove(index) bzw. remobe(object) Methode, damit sollte das ohne große Probleme möglich sein.

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

Hilfreich?
Kommentieren
Parasite
  • Forum-Beiträge: 56

06.07.2018, 10:44:33 via Website

Sry, ich habe ne Arraylist kein array, mein Fehler.

Vielleicht hätte ich noch erwähnen sollen das die Arraylist und das Quiz zwei verschiedene Java klassen sind, die Quiz Klasse zieht sich die fragen von der Arraylist Klasse.
Ich hab versucht das mit dem removed in die Arraylist zu schreiben, aber vielleicht hab ich gerade meinen Denkfehler enddeckt, ich Teste das kurz.

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.07.2018, 10:48:21 via App

//Frage aus ArrayList suchen
myFrage =myList.get(0) // o.ä.

//...

myList.remove(0);
//nächste Frage...

Alternativ hat deine Frage ein boolean Flag beantwortet, dann musst du die nächste unbeantwortete Frage finden.

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

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

06.07.2018, 14:19:00 via Website

Hi ich glaube das Thema mit der arraylist und den löschen hatten wir doch schon mal in einen anderen thread. Deine Liste besteht doch aus dem Typ String array mit 5 Einträgen wenn ich mich richtig erinnere. Der erste die Frage. Der zweite die richtige Antwort und 3 falsche Antworten.

Wenn du nun zu begin der app die Liste einmal lädst und nun ob zufällig oder der Reihe nach durchgeht die gestellte Frage aus der Liste löscht. Damit löscht einen Eintrag set aus Frage und Antworten. Danach lädst du wider ein setzt aus der Liste. Bis die Liste lehr ist.
Damit du von überall an deine Liste kommst mache sie static ist zwar nicht im Sinne von oop für dich vielleicht einfacher.

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

06.07.2018, 14:26:40 via Website

Auch macht es nicht unbedingt Sinn uns ein ähnlich es Beispiel zu geben. Wenn du es an schließen wieder anders machst
In der Methode neu frage kannst du deine auswahlbox anfragen und mit oder ohne Zufall arbeiten und als Rückgabe Wert das string array. Mit den 5 strings.

Das war nur beispielhaft!!!! 
So kann man doch nicht Code schreiben, das compiliert der doch gar nicht!!! 

Also dein erster post war schon eine richtige Methode und da
ast du die gleiche switch anweisung verschachtelt benutzt was wenig sinn macht.

Als Tipp für dein löschen nach dem zweiten mal kannst du dir deinen string array in deiner Liste erweitern und dort als 6. Wert einen string hinterlegen der dir sagt ob die Frage schon drann war.

Am Anfang wird deine Liste geladen. Eine Methode.
Laden eines fragen Set aus der Liste Index merken. Um bei zweimal antworten die Frage zu markieren.
Frage anzeigen zufällige Anzeige.
Frage auswerten hier brauchst du deine Button.
Statistik anzeigen neue Frage.

— geändert am 06.07.2018, 16:59:18

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

07.07.2018, 10:59:03 via Website

Hi ich noch mal du hast wohl deiner chackbox einen onklicklistner gegeben. Sonst würde das mit den View auch nicht gehen.
Für das was du willst brauchst du das meiner Meinung nicht.
In deiner NeueFrage Methode fragst du die Box ab erstellst dann einen ZufallsZahl in dem Bereich Anzahl der Listen Einträge.
oder erhöhtst deinen Zähler. Mit diesem Index holst du das Fragen StringArray ( Set) aus der Liste. Überbietet es an die Anzeige und Auswahl metohde.
In deiner
Bevor die neue Frage geholt wird prüfe deine zweite chackbox ob Frage gelöscht werden soll. Wenn ja löschen. Wenn nein prüfe ob Frage schon markiert ist, nein markieren. Eintrag wieder in Liste mit index speichern.
Danach weiter mit frage holen.
Arbeite bei deinen Methoden mit Rückgabe Werten.

— geändert am 07.07.2018, 16:23:23

Hilfreich?
Kommentieren
Parasite
  • Forum-Beiträge: 56

08.07.2018, 18:21:26 via Website

Wie kann ich denn Bestimmte Index zahlen markieren? oder vielleicht z.B. in einer Remove Liste einfügen die immer abgerufen wird bevor die nächste Frage geladen wird?

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

08.07.2018, 19:22:42 via App

Du kannst auch eine Int Liste führen und wenn liste.contains(myIndex) dann den nächsten nehmen.
Aber das mach den Stil nicht besser, das musst jedoch du entscheiden...

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

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

08.07.2018, 20:23:59 via Website

Du hast doch eine Liste In der Form von
ArrayList<String[5]> fragen;
Mit String frage[5] =fragen.get(zufallszahl); holst du dir doch ein fragen set was spricht dagegen einen 6. String mit zu speichern. Vielleicht für dich besser verständlich eine fünfte Antwort.
Lasse dir einen String einfallen der dir sagt das die frage benutzt Worte
String frage[6];
frage =fragen.get(zufallszahl);
//Frage anzeigen auswerten....
//Test ob chackbox zweimal fragen aktiv
If(frage[6].equals("1"))
frage.remove(zufallszahl);
else{
frage[6] ="1";
fragen.set(zufallszahl,frage);
}

— geändert am 09.07.2018, 15:34:36

Hilfreich?
Kommentieren
Parasite
  • Forum-Beiträge: 56

09.07.2018, 10:04:25 via Website

Ja, korrekt danke, das ist ne super Idee 👍 Das Versuche ich heute :)

Hilfreich?
Kommentieren