Android: Wie man ein modales Dialogfeld oder eine ähnliche modale Verhalten?
Diese Tage, die ich arbeite an der Simulation modal-dialog in Android. Ich habe gegoogelt eine Menge, es gibt viel Diskussionen, aber leider gibt es nicht viele Optionen, um es zu bekommen modal. Hier einige hintergrund
Dialoge Modale Dialoge und Blockin
Dialoge /AlertDialogs: Wie "block execution" während der dialog ist up (.NET-Stil)
Es gibt keinen geraden Weg, um modale Verhalten, dann kam ich auf 3 mögliche Lösungen
1. Verwenden Sie einen dialog-Themen-Aktivität, wie dies thread gesagt, aber ich kann immer noch nicht machen Haupttätigkeit wirklich warten, für dialog-Aktivität zurück. Haupttätigkeit wandte sich der Stopp-status und bekam dann neu gestartet.
2. Erstellen Sie einen worker-thread, und verwenden thread-Synchronisation. Jedoch, es ist eine riesige refactoring job für meine app, jetzt habe ich einen einzigen Haupt-activity und einem service in der Haupt-UI-thread.
3. Nehmen Sie über event-handling innerhalb einer Schleife, wenn es ein modales Dialogfeld, und beende Schleife, wenn die Dialogbox geschlossen wird. Eigentlich ist es der Weg für den Bau eines echten modalen dialog, was es genau bedeutet in Windows. Ich habe noch nicht einen Prototypen auf diese Weise.
Ich würde noch gerne simulieren, es mit einem dialog-Themen-Aktivität,
1. start-dialog-Aktivität durch startActivityForResult()
2. bekomme aus onActivityResult()
Hier einige Quelle
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyView v = new MyView(this);
setContentView(v);
}
private final int RESULT_CODE_ALERT = 1;
private boolean mAlertResult = false;
public boolean startAlertDialog() {
Intent it = new Intent(this, DialogActivity.class);
it.putExtra("AlertInfo", "This is an alert");
startActivityForResult(it, RESULT_CODE_ALERT);
//I want to wait right here
return mAlertResult;
}
@Override
protected void onActivityResult (int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case RESULT_CODE_ALERT:
Bundle ret = data.getExtras();
mAlertResult = ret.getBoolean("AlertResult");
break;
}
}
}
Den Aufrufer startAlertDialog, block-Ausführung und Ergebnis zu erwarten. Aber startAlertDialog sofort zurückgegeben, natürlich, und Haupt-activity ging in STOP-Zustand während DialogActivity war.
Ist also die Frage, wie man Haupttätigkeit wirklich warten, bis Ergebnis?
Danke.
InformationsquelleAutor der Frage fifth | 2011-05-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bekam ich einen modalen Dialog während der Verwendung:
auf dem DialogFragment (nicht auf die DialogBuilder).
InformationsquelleAutor der Antwort meises
Ist es nicht möglich, wie Sie geplant. Erste, Sie sind nicht erlaubt das blockieren der UI-thread. Ihre Anwendung wird beendet. Zweitens müssen Griff die Lebenszyklus-Methoden, die aufgerufen werden, wenn eine andere Aktivität gestartet wird mit
startActivity
(Ihre ursprüngliche Tätigkeit wird angehalten, während die andere Aktivität ausgeführt wird). Dritte, werden Sie wahrscheinlich könnte irgendwie hack es mitstartAlertDialog()
nicht von dem UI-thread mit thread-Synchronisation (wieObject.wait()
) und einigeAlertDialog
. Aber ich stark Sie ermutigen, dies nicht tun. Es ist hässlich, wird Sie sicherlich brechen und es ist einfach nicht die Art, wie die Dinge gedacht sind, um zu arbeiten.Neugestaltung Ihrer Ansatz zur Erfassung der asynchronen Natur dieser Ereignisse. Wenn Sie möchten, dass zum Beispiel einige dialog fragt den Benutzer nach einer decsision (wie das akzeptieren der AGB oder nicht) und spezielle Maßnahmen auf der Grundlage dieser Entscheidung erstellen Sie ein Dialogfeld wie dieses:
Dann haben zwei Methoden, Umgang mit positiven oder negativen feedback entsprechend (d.h. Verfahren mit einigen operation oder Abschluss der Aktivität oder was auch immer Sinn macht).
InformationsquelleAutor der Antwort Stephan
Entwicklern von Android-und iOS entschieden, dass Sie sind mächtig und schlau genug, um abzulehnen, Modales Dialog-Konzeption (das war auf dem Markt für viele-viele Jahre schon, und nicht stört niemanden vor), leider für uns.
Hier ist meine Lösung, es funktioniert Super:
InformationsquelleAutor der Antwort art926
Diese funktioniert bei mir: erstellen Sie eine Aktivität, wie Sie Ihren dialog. Dann,
Fügen Sie diese zu Ihrem manifest für die Aktivität:
android:theme="@android:style/Theme.Dialog"
Hinzufügen onCreate deiner Aktivität
setFinishOnTouchOutside (false);
OnBackPressed überschreiben Sie in Ihrer Tätigkeit:
@Override
public void onBackPressed()
{
//verhindern, dass "zurück" verlassen Sie diese Aktivität
}
Der erste gibt die Aktivität den dialog suchen. Die letzteren beiden machen es sich wie ein modales Dialogfeld.
InformationsquelleAutor der Antwort Peri Hartman
Schließlich landete ich mit einem wirklich gerade und einfache Lösung.
Menschen, die vertraut mit der Win32-Programmierung vielleicht weiß, wie man implementieren Sie einen modalen dialog. In der Regel läuft eine geschachtelte Nachricht, die Schleife (durch GetMessage/PostMessage), wenn es ein Modaler dialog. Also versuchte ich, die Umsetzung eigener Modaler dialog in dieser traditionellen Weise.
Unter den ersten, die android nicht bieten Schnittstellen zu injizieren in ui-thread (message-loop), oder ich habe keins gefunden. Wenn ich sah in die Quelle, Looper.loop(), ich fand es ist genau das, was ich wollte. Aber immer noch, MessageQueue/Message noch keinen öffentlichen Schnittstellen. Zum Glück haben wir die Reflexion in java.
Im Grunde habe ich nur kopiert genau das, was Einlegen.loop() hast, blockiert es den workflow und noch richtig behandelt Ereignisse. Habe ich noch nicht getestet verschachtelte modalen dialog, aber theoretisch würde es auch funktionieren.
Hier ist mein Quellcode,
Hoffentlich helfen würde.
InformationsquelleAutor der Antwort fifth
Es ist nicht schwer.
Nehme an, Sie haben eine fahne, die auf Ihre Besitzer-Aktivität (benannt
waiting_for_result
), wenn Sie Ihre Tätigkeit wieder aufgenommen wird:Dies garantiert der Inhaber Aktivität, es sei denn, der modale dialog geschlossen wird, wenn Sie versuchen, um den Fokus auf den modal-dialog-Aktivität.
InformationsquelleAutor der Antwort xandy
One-Lösung ist :
alert.show();
muss die Letzte code-Zeile in der aufrufenden Funktion die Warnung. Jeder code nach dieser Zeile nicht warten, um zu schließen Sie die Warnung, aber wird sofort ausgeführt.Hoffnung Hilfe!
InformationsquelleAutor der Antwort Rambo VI
Als hackbod und andere haben darauf hingewiesen, Android bewusst nicht bieten eine Methode, das zu tun verschachtelten event-loops. Ich verstehe die Gründe, aber es gibt bestimmte Situationen, die Sie benötigen. In unserem Fall haben wir unseren eigenen virtuellen Maschine läuft auf verschiedenen Plattformen und wir wollten die Portierung auf Android. Intern gibt es eine Menge von Orten, wo es erfordert eine verschachtelte Schleife Ereignis und es ist nicht wirklich machbar, das ganze umzuschreiben nur für Android. Wie auch immer, hier ist eine Lösung (im Grunde genommen aus Wie kann ich nicht-blockierende Ereignisse die Verarbeitung auf Android?aber ich habe eine timeout):
InformationsquelleAutor der Antwort CpnCrunch
Ich habe eine ähnliche Lösung wie fünfteaber es ist ein bisschen
einfacher und braucht nicht nachdenken. Meine überlegung war, warum nicht
verwenden Sie eine Ausnahme, die zum beenden des Greifers. Also mein custom looper
liest sich wie folgt:
1) die Ausnahme, Die geworfen wird:
2) Die custom-looper:
Die Nutzung der custom looper ist ganz einfach. Angenommen
Sie haben eine dialog-foo, dann tun Sie einfach Folgendes
wo Sie wollen, rufen Sie das Dialogfeld foo Modal:
a) Wenn die Berufung in das foo:
In das Dialogfeld foo, wenn Sie das Programm verlassen möchten, Sie einfach
rufen Sie die quit-Methode der benutzerdefinierten looper. Das sieht
wie folgt:
b) Beim verlassen von foo:
Ich habe vor kurzem gesehen, einige Probleme mit 5.1.1 Android,
nicht rufen Sie ein modales Dialogfeld aus dem Hauptmenü, statt post ein
Veranstaltung, fordert das modale Dialogfeld. Ohne die Buchung der
Hauptmenü stall, und ich habe gesehen, Looper::pollInner()
SIGSEGVs in meiner app.
InformationsquelleAutor der Antwort j4n bur53
Ich bin nicht sicher, ob das 100% modal, wie Sie klicken Sie auf einige andere Komponente, um das Dialogfeld zu schließen, aber ich war verwirrt mit den Schleifen-Konstrukte und daher biete ich dies als eine weitere Möglichkeit. Es funktionierte gut für mich, so möchte ich die Idee. Sie können erstellen und öffnen Sie das Dialogfeld in eine Methode und schließen Sie es dann in der callback-Methode und das Programm wartet auf die Antwort-dialog vor dem ausführen der callback-Methode. Wenn Sie dann den rest der callback-Methode in einem neuen thread, das Dialogfeld zu schließen, bevor der restliche code ausgeführt wird. Das einzige, was Sie tun müssen, ist, um eine Globale Dialogfeld Variablen, so dass verschiedene Methoden können in der acccess. So etwas, wie den folgenden arbeiten kann:
InformationsquelleAutor der Antwort DCS
Verwenden Sie einen BroadcastReceiver, ruft die nächste Methode in der Aktivität.
Tot-Ende der Tätigkeit code dialogFragment.show(fragmentTransaction, TAG); und weiter im onReceive()--ich bin nicht 100% positiv, aber ich würde legen Geld, startActivityForResult(); beruht genau auf diesem Konzept.
Bis diese Methode aufgerufen wird, von dem Empfänger, der code stand in der Wartezeit für Benutzer-Interaktion, ohne ANR.
DialogFragment die onCreateView-Methode
Diese Methode richtet sich auf den Aufbau einer DialogFrament extension-Klasse und dem Aufruf einer Instanz der Klasse durch die Aktivität.
Jedoch...
Einfache, klare, einfache und wirklich modal.
InformationsquelleAutor der Antwort me_