Doppelte Switch case Anweisung mit zwei Checkboxxen

  • Antworten:24
  • OffenNicht stickyNicht beantwortet
  • 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.

Diskutiere mit!
  • 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?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.173

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?
Diskutiere mit!
  • 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?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.173

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?
Diskutiere mit!
  • Forum-Beiträge: 483

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?
Diskutiere mit!
  • 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?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.173

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?
Diskutiere mit!
  • 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?
Diskutiere mit!
  • Forum-Beiträge: 483

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?
Diskutiere mit!
  • 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?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.173

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.androidpit.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?
Diskutiere mit!
  • 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?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.173

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?
Diskutiere mit!
  • 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?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.173

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?
Diskutiere mit!
  • 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?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.173

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?
Diskutiere mit!
  • Forum-Beiträge: 483

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?
Diskutiere mit!
  • Forum-Beiträge: 483

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?
Diskutiere mit!

Empfohlene Artikel