Dialog auswerten

K

kay-ju

Neues Mitglied
0
Hallo,

ich möchte einen "Personen-Erkenner" programmieren. Es sollen mehrere
Fragen mittels Dialog gestellt werden und dann die Person begrüßt werden.
Der Dialog besteht aus einem Text und zwei Buttons.

Das Problem ist, dass die App - wenn der Dialog eingeblendet wird - im
Hintergrund weiter läuft und nicht auf die Eingabe wartet. Und wenn ich
dann einen Knopf drücke, ist die App schon weiter und die Abfrage ist
schon passiert.

Weiss jemand, wie ich das verwirklichen kann?

Ich habe es bereits mit einer Semaphore probiert, die hängt sich aber beim
semaphore.acquire() auf.

Für Ideen bin ich dankbar.
 
Was hast du schon versucht im Code?
 
Hi Jaiel,

sorry, aber was macht Deine Musik in einem
Forum, das auf Android-Hilfe ausgerichtet ist?
 
  • Danke
Reaktionen: missspelled
Na das Problem scheint ja gelöst zu sein :D
 
Nee, so ganz ist das Problem leider nicht gelöst.
Ich poste mal, was ich bis jetzt auf die Beine gestellt habe :

Der code der main activity :

Code:
package com.example.hallopersonumgekehrtereihenfolge;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {
 
    int buttonId;
 
    public void gruesse(String name)
    {
        Toast.makeText(MainActivity.this,"Hallo, " + name,Toast.LENGTH_LONG).show();     
    }
 
    public void frage(String f, String b1, String b2)
    {
        buttonId = 0;
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setMessage(f);
       
        alertDialogBuilder.setPositiveButton(b1, new DialogInterface.OnClickListener() {
           @Override
           public void onClick(DialogInterface arg0, int arg1) {
               buttonId = 1;
           }
        });
       
        alertDialogBuilder.setNegativeButton(b2, new DialogInterface.OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int which) {
               buttonId = 2;
           }
        });
       
        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }
 
    public void open(View view)
    {
       frage("Bist du männlich oder weiblich?", "w", "m");
       frage("Trägst Du eine Brille?", "nein", "ja");
       frage("Bist Du über 40 Jahre alt?", "nein", "ja");
       if (buttonId == 1)
           gruesse("Benutzer");
    }
    
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
   }
}

Und hier ist der zugehörige xml-code

Code:
<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:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin"
   tools:context=".MainActivity">

   <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Personen-Erkenner"
      android:id="@+id/textView"
      android:textSize="35dp"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true" />
         
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Starte"
      android:id="@+id/button"
      android:layout_alignRight="@+id/textView2"
      android:layout_alignEnd="@+id/textView2"
      android:layout_marginTop="42dp"
      android:onClick="open"
      android:layout_alignLeft="@+id/imageView"
      android:layout_alignStart="@+id/imageView"
      android:layout_centerHorizontal="true" />

</RelativeLayout>

Das Problem ist :
Der Dialog, der von "frage" aufgerufen wird wartet
nicht auf Eingabe, sondern die App läuft im Hintergrund weiter.
Das hat unter anderem zur Folge, dass die Fragen in umgekehrter
Reihenfolge ausgegeben werden.

Gruß
Kay-Ju
 
Probiers mal so:

Code:
public class MainActivity extends Activity {

private ArrayList<Frage> fragen;

public void gruesse(String name)
{
Toast.makeText(MainActivity.this,"Hallo, " + name, Toast.LENGTH_LONG).show();
}

public void frage(final int i)
{
final Frage frage = fragen.get(i);
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setMessage(frage.getText());

alertDialogBuilder.setPositiveButton(frage.getPositiveAnswer(), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
frage.setAnswer(frage.getPositiveAnswer());
naechsteFrage(i);
}
});

alertDialogBuilder.setNegativeButton(frage.getNegativeAnswer(), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
frage.setAnswer(frage.getNegativeAnswer());
naechsteFrage(i);
}
});

AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}

void naechsteFrage(int i) {
i++;
if (i >= fragen.size()) {
gruesse("Benutzer");
}else{
frage(i);
}
}

public void open(View view)
{
fragen = new ArrayList<>();
fragen.add(new Frage("Bist du männlich oder weiblich?", "w", "m"));
fragen.add(new Frage("Trägst Du eine Brille?", "nein", "ja"));
fragen.add(new Frage("Bist Du über 40 Jahre alt?", "nein", "ja"));
frage(0);
}

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

Code:
public class Frage{
String text, positiveAnswer, negativeAnswer, answer;

public Frage(String text, String positiveAnswer, String negativeAnswer) {
this.text = text;
this.positiveAnswer = positiveAnswer;
this.negativeAnswer = negativeAnswer;
}

public String getText() {
return text;
}

public String getPositiveAnswer() {
return positiveAnswer;
}

public String getNegativeAnswer() {
return negativeAnswer;
}

public String getAnswer() {
return answer;
}

public void setAnswer(String answer) {
this.answer = answer;
}
}

Generell ist es besser und übersichtlicher für Frage eine eigene Klasse zu erstellen als einfach 3 Strings an die Methode zu übergeben.

Mit meinem Code werden die Fragen in der richtigen Reihenfolge gestellt und die Antwort in den Fragen Objekten gespeichert. In der gruesse() Methode könntest du dann die Antworten aus den Fragen Objekten auslesen. Der Code ist immer noch nicht sehr schön, aber ich habe versucht möglichst wenig zu ändern damit du es besser nachvollziehen kannst. Du kannst jetzt auch beliebig viele weitere Fragen zur der ArrayList mit den Fragen hinzufügen ohne dass du am restlichen Code etwas ändern musst.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: kay-ju
Hallo Daaaaniel,

vielen Dank für die Mühe und Zeit, die Du investiert hast.
Jetzt brauch ich ja nur noch die Antworten auszuwerten und
je nachdem die entsprechende Person zu gruessen. Damit
bin ich schon fertig.

Du schreibst, dass der code immer noch nicht sehr schön sei.
Hast Du noch ein paar Tipps, was ich sauberer programmieren
kann?

Gruß
kay-ju
 
kay-ju schrieb:
Hallo Daaaaniel,

vielen Dank für die Mühe und Zeit, die Du investiert hast.
Jetzt brauch ich ja nur noch die Antworten auszuwerten und
je nachdem die entsprechende Person zu gruessen. Damit
bin ich schon fertig.

Du schreibst, dass der code immer noch nicht sehr schön sei.
Hast Du noch ein paar Tipps, was ich sauberer programmieren
kann?

Gruß
kay-ju

Ja genau, kannst dich gerne wieder melden falls du noch Probleme dabei hast.

Hier sind ein paar Sachen die mir aufgefallen sind:
- generell ist es schöner englische Namen zu vergeben weil das sonst so eine Englisch-Deutsch-Mischung gibt

- Wenn du für Android programmierst solltest du am besten alle Strings die du verwendest als Ressource speichern. Also alle Strings in die /res/values/strings.xml Datei eintragen. Dann kannst du mit getString(R.string.[id]) wieder darauf zugreifen. Das gleiche gilt auch für Strings in den xml layouts, da kannst du mit @string/[id] darauf zugreifen. Wenn die Fragen in deiner App immer gleich bleiben wäre es soweit ich weiß am besten die Fragen mit den zugehörigen Antwortmöglichkeiten als Array in den Ressourcen zu speichern. Dann musst du die 3 Strings nicht jedes Mal in den Code schreiben.

- Textgrößen im layout immer in sp, nicht in dp angeben
 

Ähnliche Themen

W
  • waltsoft
Antworten
4
Aufrufe
930
waltsoft
W
D
Antworten
2
Aufrufe
957
swa00
swa00
kukuk
  • kukuk
Antworten
5
Aufrufe
988
kukuk
kukuk
Zurück
Oben Unten