Android AlertDialog; Buttons ändern

TimeIsTheKey

Aktives Mitglied
Hallo

Ich hab letztes Wochenend mit der Android-Programmierung angefangen und ich hänge an einem Problem. Ich habe ein AlertDialog, dessen Inhalt ich immer wieder ändere, sobald ein Knopf (Weiter) gedrückt wird. Nun möchte ich, dass in einem bestimmten Fall die Buttons ausgewechselt werden.

Hintergrund der Applikation: Mit ihr soll man lernen können. Das Dialog zeigt eine Frage. Nachdem man weiter klickt, soll man die Möglichkeit für falsch/richtig haben. Egal was gedrückt wird: Es wird eine Frage angezeigt wieder mit dem Button Weiter. Das soll alles auf dem gleichen AlertDialog geschehen. Allerdings funktioniert meine Implementierung nicht und ich verstehe nicht wo mein Fehler liegt. Könnte sich das jemand schnell anschauen?

Code:
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("Frage");
		builder.setView(flistview);
		falert = builder.create();

                //in einer Methode-->
                public void nextQuestion(boolean next) {
                         buttonHandler(true);
                         falert.show();
		         buttonHandler(false);
                }

                public void buttonHandler(boolean cancel) {
		if (cancel) {
			Log.v("Button", "Canceltrue");
			if (!optfselect[1]) {
				falert.setButton(AlertDialog.BUTTON_POSITIVE, "Abbrechen",
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int id) {
								Log.v("Button", "WTF1");
							}
						});
				falert.setButton(AlertDialog.BUTTON_NEUTRAL, "Zurück",
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int id) {
								nextQuestion(false);
								Log.v("Button", "WTF2");
							}
						});
				falert.setButton(AlertDialog.BUTTON_NEGATIVE, "Weiter",
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int id) {
								nextQuestion(true);
								Log.v("Button", "WTF3");
							}
						});
			} else {
				if (fanzeige) {
					Log.v("Button", "fanzeige true");
					falert.setButton(AlertDialog.BUTTON_POSITIVE, "Abbrechen",
							new DialogInterface.OnClickListener() {
								public void onClick(DialogInterface dialog,
										int id) {
									Log.v("Button", "WTF4");
								}
							});
					falert.setButton(AlertDialog.BUTTON_NEUTRAL, "Weiter",
							new DialogInterface.OnClickListener() {
								public void onClick(DialogInterface dialog,
										int id) {
									nextQuestion(true);
									Log.v("Button", "WTF5");
								}
							});
				} else {
					Log.v("Button", "fanzeige false");
					falert.setButton(AlertDialog.BUTTON_POSITIVE, "Abbrechen",
							new DialogInterface.OnClickListener() {
								public void onClick(DialogInterface dialog,
										int id) {
									Log.v("Button", "WTF6");
								}
							});
					falert.setButton(AlertDialog.BUTTON_NEUTRAL, "Falsch",
							new DialogInterface.OnClickListener() {
								public void onClick(DialogInterface dialog,
										int id) {
									nextQuestion(false);
									Log.v("Button", "WTF7");
								}
							});
					falert.setButton(AlertDialog.BUTTON_NEGATIVE, "Richtig",
							new DialogInterface.OnClickListener() {
								public void onClick(DialogInterface dialog,
										int id) {
									Log.v("Button", "WTF8");
								}
							});
				}
			}
		} else {
			Log.v("Button", "Cancelfalse");
			if (!optfselect[1]) {
				Button cancelButton = falert
						.getButton(DialogInterface.BUTTON_POSITIVE);
				cancelButton.setOnClickListener(new View.OnClickListener() {
					@Override
					public void onClick(View v) {
						bestaetigen();
						Log.v("Button", "WT9");
					}

				});
				Button backButton = falert
						.getButton(DialogInterface.BUTTON_NEUTRAL);
				backButton.setOnClickListener(new View.OnClickListener() {
					@Override
					public void onClick(View v) {
						nextQuestion(false);
						Log.v("Button", "WTF10");
					}

				});
				Button nextButton = falert
						.getButton(DialogInterface.BUTTON_NEGATIVE);
				nextButton.setOnClickListener(new View.OnClickListener() {
					@Override
					public void onClick(View v) {
						nextQuestion(true);
						Log.v("Button", "WTF11");
					}

				});
			} else {
				if (fanzeige) {
					Log.v("Button", "fanzeige true");
					Button cancelButton = falert
							.getButton(DialogInterface.BUTTON_POSITIVE);
					cancelButton.setOnClickListener(new View.OnClickListener() {
						@Override
						public void onClick(View v) {
							bestaetigen();
							Log.v("Button", "WTF12");
						}

					});
					Button nextButton = falert
							.getButton(DialogInterface.BUTTON_NEUTRAL);
					nextButton.setOnClickListener(new View.OnClickListener() {
						@Override
						public void onClick(View v) {
							nextQuestion(true);
							buttonHandler(false);
							Log.v("Button", "WTF13");
						}

					});
				} else {
					Log.v("Button", "fanzeige false");
					Button cancelButton = falert
							.getButton(DialogInterface.BUTTON_POSITIVE);
					cancelButton.setOnClickListener(new View.OnClickListener() {
						@Override
						public void onClick(View v) {
							bestaetigen();
							Log.v("Button", "WTF14");
						}

					});
					Button wrongButton = falert
							.getButton(DialogInterface.BUTTON_NEUTRAL);
					wrongButton.setOnClickListener(new View.OnClickListener() {
						@Override
						public void onClick(View v) {
							Log.v("Button", "WTF15");
							fwrong++;
							wfragen.add(fcounter);
							nextQuestion(true);
						}

					});
					Button rightButton = falert
							.getButton(DialogInterface.BUTTON_NEGATIVE);
					rightButton.setOnClickListener(new View.OnClickListener() {
						@Override
						public void onClick(View v) {
							Log.v("Button", "WTF16");
							nextQuestion(true);
						}

					});
				}
			}
		}
	}

Ich hab diese Methode, weil ich nicht möchte das sich mein Dialog nach einem Klick selbst schliesst (standardmässig). Deswegen setze ich nach dem show des Dialogs einen neuen Listener, damit sich das nicht selbst schliesst. Das Setzen des Listener funktioniert (er macht also die richtige Funktion), aber die Knöpfe werden nicht angezeigt. Cancel und optfselect[1] sind bei der Abfrage auf true, fanzeige auf false. Er macht also die setMethoden, aber es werden immer noch die alten Knöpfe angezeigt und das kann ich mir nicht erklären ...

Vielen Dank
MfG
 
Du hast hier offensichtlich eine Funktionalität gebaut die in eine Activity und nicht einen Dialog gehört. Mein erster Rat ist also, genau das zu tun und den Code umzubauen auf dass deine Abfrage innerhalb einer Activity geschieht.

Falls du trotzdem bei dem (nicht Mobile UI gemäßen) modalen Dialog bleiben möchtest, solltest du auf einen Custom-Dialog umsteigen und dann mit falert.findViewById(R.id.deineButtonID) die Button-View Referenz holen um so den Text neu zu setzen.
 
Du hast hier offensichtlich eine Funktionalität gebaut die in eine Activity und nicht einen Dialog gehört. Mein erster Rat ist also, genau das zu tun und den Code umzubauen auf dass deine Abfrage innerhalb einer Activity geschieht.

Falls du trotzdem bei dem (nicht Mobile UI gemäßen) modalen Dialog bleiben möchtest, solltest du auf einen Custom-Dialog umsteigen und dann mit falert.findViewById(R.id.deineButtonID) die Button-View Referenz holen um so den Text neu zu setzen.

Die Funktionalität ist in einer Activity. In einer TabActivity um genau zu sein.
Ich möchte aber ein modales Dialog, dass sie Knöpfe wechseln kann. Mit setText und invalidate kann ich den Text der Knöpfe verändern. Was allerdings nicht geht ist ein neues Knöpfchen hinzuzufügen. Habe ich z.B. 2 Knöpfe (positiv/negativ), kann ich nach dem show kein neutrales setzen. Wie bringe ich das trotzdem hin?
 
Wie bereits geschrieben, falls du bei dem nicht mobile UI gemäßen modalen Dialog bleiben möchtest musst du einen Custom-Dialog erstellen und dann mit findViewById deine Container-View auswählen um den Button hinzuzufügen.

Das musst du so machen, da der Dialog von Haus aus keine Möglichkeit hat die Buttons nachträglich zu verändern, das geschieht ja alles per Builder-Objekt.
 
Wie bereits geschrieben, falls du bei dem nicht mobile UI gemäßen modalen Dialog bleiben möchtest musst du einen Custom-Dialog erstellen und dann mit findViewById deine Container-View auswählen um den Button hinzuzufügen.

Das musst du so machen, da der Dialog von Haus aus keine Möglichkeit hat die Buttons nachträglich zu verändern, das geschieht ja alles per Builder-Objekt.

Achso, dann hab ich dich völlig missverstanden, sorry. Kannst du mir eventuell näher beschreiben, wie das aussehen soll? Ich hab jetzt eine eigene Klasse erstellt, die von Dialog erbt. In dieser soll über setContentView() ein Layout gesetzt werden. Im Layout habe ich bis jetzt folgendes:

Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
	<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragenlist"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#9d9d9d"
    android:layout_weight="1"
    android:drawSelectorOnTop="false"/>
	<Button
	    android:id="@+id/button1"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:onClick="selfDestruct" />
	<Button
	 android:id="@+id/button2"
     android:layout_height="wrap_content"
     android:layout_width="wrap_content"
     android:onClick="selfDestruct" />
	<Button
	 android:id="@+id/button3"
     android:layout_height="wrap_content"
     android:layout_width="wrap_content"
     android:onClick="selfDestruct" />
</LinearLayout>

Wie bekomme ich die Knöpfe nebeneinander und kann ich die Knöpfe dann auch wirklich ausblenden wenn ich das so definiere? Ich verstehe auch nicht ganz genau, wie mir das CustomDialog zur Lösung verhilft. Ich meine, wenn ich über findViewById das Button setze, wird doch genau das gleiche wie in meinem Code auch schon gemacht, oder habe ich da etwas noch nicht verstanden?

Wäre dir wirklich sehr dankbar, wenn du mir helfen könntest. Wenn ich das mit dem modalen Dialog hinkriege bin ich mit meinem App fertig.
 

Zurück
Oben