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
 

schlingel

Gesperrter Benutzer
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.
 

TimeIsTheKey

Aktives Mitglied
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?
 

schlingel

Gesperrter Benutzer
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.
 

TimeIsTheKey

Aktives Mitglied
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W AlertDialog Eigenschaften existiert nicht mehr. Android & Cross-Platform Mobile Apps 14
W Android Wieso geht getApplicationContext() bei Toast, aber nicht bei AlertDialog.Builder? Android & Cross-Platform Mobile Apps 36
A AlertDialog Enable Button Android & Cross-Platform Mobile Apps 1
S onClickListener auf Buttons die im Code erzeugt wurden setzen. Android & Cross-Platform Mobile Apps 8
L Hintergrund eines Switch(Buttons) ändern Android & Cross-Platform Mobile Apps 3
D Android dynamische Buttons positionieren Android & Cross-Platform Mobile Apps 1
N Android Zwei Buttons gleichzeitig drücken Android & Cross-Platform Mobile Apps 9
H Buttons färben sich mit, beim Hintergrund ändern Android & Cross-Platform Mobile Apps 3
D Hilfe! es geht um Buttons und Sounds Android & Cross-Platform Mobile Apps 14
K Dynamische (Image)Buttons, Größe bestimmen Android & Cross-Platform Mobile Apps 4
V Buttons bei Klick hinzufügen Android & Cross-Platform Mobile Apps 2
V Buttons zur Actionbar hinzufügen Android & Cross-Platform Mobile Apps 4
L Android Bildschirm bleibt dunkel nach neustarten der App nach betätigen des Home-Buttons Android & Cross-Platform Mobile Apps 3
D Android Viele Buttons und ein Layout Android & Cross-Platform Mobile Apps 6
K Verständisfrage bzgl. Buttons und ihnen eine Funktion geben. Android & Cross-Platform Mobile Apps 3
P Buttons im + anordnen Android & Cross-Platform Mobile Apps 2
H Buttons werden falsch angeordent Android & Cross-Platform Mobile Apps 2
F Buttons und awt? Android & Cross-Platform Mobile Apps 7
W Edit Text Drawable Icon ändern plus Funktion Android & Cross-Platform Mobile Apps 30
missy72 Android ImageView Aus- Einblenden und Ressource ändern Android & Cross-Platform Mobile Apps 1
W Pixel Farbe in eine andere Farbe ändern im ImageView von ein Icon Android & Cross-Platform Mobile Apps 14
W Rand ändern beim ImageView bei Picasso Android & Cross-Platform Mobile Apps 1
OSchriever Navigation drawer Strings ändern sich nicht Android & Cross-Platform Mobile Apps 0
AGW Android Links im Menü und Namen ändern Android & Cross-Platform Mobile Apps 2
O Android Spinner-Array ändern Android & Cross-Platform Mobile Apps 6
AGW Android Teilen Button ändern Android & Cross-Platform Mobile Apps 14
A ImageButton in ListView Item bei klick ändern Android & Cross-Platform Mobile Apps 3
S Android Style vom Spinner ändern (Dropdown sowie Fontfarbe) Android & Cross-Platform Mobile Apps 1
Maresuke Android Android ListView Textfarbe und Texthintergrund ändern? Android & Cross-Platform Mobile Apps 5
A Fehlermeldung beim ändern der ViewGroup. Android & Cross-Platform Mobile Apps 6
H Fehler Actionbar Theme ändern Android & Cross-Platform Mobile Apps 2
S Android CheckBox Status von anderer Klasse aus ändern Android & Cross-Platform Mobile Apps 4
H Radiobutton Eigenschaften ändern (in Radiogroup) Android & Cross-Platform Mobile Apps 2
G Android zur Laufzeit den Text im Menü ändern Android & Cross-Platform Mobile Apps 3
JAVAnnik Android Layout ändern in Thread Android & Cross-Platform Mobile Apps 2
Maxim6394 [ Android ] Activity ändern Android & Cross-Platform Mobile Apps 9
Maxim6394 [Android] contentView ändern Android & Cross-Platform Mobile Apps 3
I Android Hintergrundfarbe von Textview (Shape) ändern Android & Cross-Platform Mobile Apps 19
J Java ME vorhandes Javaprojekt in JavaME ändern Android & Cross-Platform Mobile Apps 6
G Schriftgröße in einem TextField ändern Android & Cross-Platform Mobile Apps 2

Ähnliche Java Themen

Neue Themen


Oben