Ich versuche, einen benutzerdefinierten Dialog in Android zu generieren. Ich erstelle meinen Dialog folgendermaßen:
dialog = new Dialog(this);
dialog.setContentView(R.layout.my_dialog);
Bis auf den Titel des Dialogs funktioniert alles einwandfrei. Auch wenn ich den Titel des Dialogfelds nicht festlege, hat das Dialogfeld-Popup an der Position des Dialogfelds ein Leerzeichen.
Gibt es eine Möglichkeit, diesen Teil des Dialogs zu verbergen?
Ich habe es mit einem AlertDialog versucht, aber es scheint, dass das Layout nicht richtig eingestellt ist:
LayoutInflater inflater =
(LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.map_dialog, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(view);
// dialog = new Dialog(this);
// dialog.setContentView(R.layout.map_dialog);
dialog = builder.create();
((TextView) dialog.findViewById(R.id.nr)).setText(number);
Wenn ich diesen Code verwende, erhalte ich in der letzten Zeile eine Null-Zeiger-Ausnahme. Der Dialog ist nicht null, daher existiert die Textansicht, die ich abzurufen versuche, nicht.
Wenn ich den Teil, in dem ich den Dialogkonstruktor verwende, auskommentiere, funktioniert alles einwandfrei, bis auf den Titel über meinem Dialoglayout.
quelle
Antworten:
Sie können den Titel eines Dialogfelds ausblenden, indem Sie:
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Vorherige Version dieser Antwort, die überkompliziert ist:
Sie müssen eine verwenden
AlertDialog
. Auf der Website des Android-Entwicklers finden Sie eine gute Erklärung zu benutzerdefinierten Dialogen .In einer sehr kurzen Zusammenfassung tun Sie dies mit Code, wie er unten von der offiziellen Website kopiert wurde. Das nimmt eine benutzerdefinierte Layot-Datei, bläst sie auf, gibt ihr einen grundlegenden Text und ein Symbol und erstellt sie dann. Sie würden es dann mit zeigen
alertDialog.show()
.Als Antwort auf den Kommentar:
Ich gehe davon aus, dass sich TextView mit der ID
nr
in der Ansicht befindet, mit der Sie aufblasenView view = inflater....
. Wenn ja, müssen Sie nur ein Bit ändern: anstatt es zudialog.findView...
machenview.findView...
. Denken Sie dann daran, dialog.show () oder sogar builder.show () zu verwenden, ohne sich die Mühe zu machen, builder.create () auszuführen.quelle
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
FEATURE_NO_TITLE funktioniert beim Erstellen eines Dialogfelds von Grund auf wie folgt:
Es funktioniert jedoch nicht, wenn Sie einen AlertDialog erstellen (oder den Builder verwenden), da der Titel bereits deaktiviert und intern ein benutzerdefinierter Titel verwendet wird.
Ich habe mir die SDK-Quellen angesehen und denke, dass es nicht umgangen werden kann. Um den oberen Abstand zu entfernen, besteht die einzige Lösung darin, ein benutzerdefiniertes Dialogfeld von Grund auf neu zu erstellen, indem Sie die Dialogklasse direkt verwenden.
Man kann das auch mit einem Stil machen, zB in styles.xml:
Und dann:
quelle
Dialog
, aber das Erstellen einesAlertDialog
war viel einfacher. Wie in den Dokumenten angegeben :The Dialog class is the base class for dialogs, but you should avoid instantiating Dialog directly. Instead, use one of the following subclasses: <AlertDialog and others described here>
. DasAlertDialog
erledigt auch Lebenszyklus-Sachen und ok / stornieren auf einfache Weise.Fügen Sie in Ihrem Code diese Zeile hinzu
Oder verwenden Sie in XML ein Thema
XML wäre eine bessere Implementierung, da mit der Codeversion die Titelleiste erstellt und dann entfernt wird, was eine Verschwendung von Ressourcen darstellt
Ändern Sie den Typ des Warnungsdialogs in einen Systemdialog (z. B. TYPE_SYSTEM_OVERLAY) und prüfen Sie, ob dies Ihr Problem behebt
quelle
Verwenden Sie wie folgt:
Dadurch werden alle Titelleisten aus dem Dialogfenster entfernt.
quelle
Verwenden Sie den folgenden Code vor
setcontentview
: -Hinweis : Sie müssen den obigen Code in derselben Reihenfolge und Zeile haben.
requestWindowFeature
muss vor der Zeile setContentView stehen.quelle
Sie können den Titel von entfernen
Dabei ist Dialog der Name meines Dialogs.
quelle
Wenn Sie in Ihrem Code verwenden
requestWindowFeature(Window.FEATURE_NO_TITLE);
, stellen Sie sicher, dass er vorher ausgeführt wird, dadialog.setContentView();
sonst die Anwendung abstürzt.quelle
Ich habe Three Way gefunden, um dies zu tun>
1) Verwenden von requestWindowFeature
2) Verwenden von style (style.xml)
3) Verwenden des XML-Themas in AndroidManifest.xml
quelle
Fügen Sie in Ihrer Custom_Dialog.java-Klasse hinzu
requestWindowFeature(Window.FEATURE_NO_TITLE)
quelle
oliviergs antwort bei mir funktioniert und ist die beste Lösung, wenn das Erstellen einer benutzerdefinierten Dialogklasse der Weg ist, den Sie gehen möchten. Es hat mich jedoch gestört, dass ich die AlertDialog-Klasse nicht verwenden konnte. Ich wollte den Standardsystem-AlertDialog-Stil verwenden können. Das Erstellen einer benutzerdefinierten Dialogklasse hätte diesen Stil nicht.
Also habe ich eine Lösung (Hack) gefunden, die funktioniert, ohne dass eine benutzerdefinierte Klasse erstellt werden muss. Sie können die vorhandenen Builder verwenden.
Der AlertDialog platziert eine Ansicht über Ihrer Inhaltsansicht als Platzhalter für den Titel. Wenn Sie die Ansicht finden und die Höhe auf 0 setzen, wird das Leerzeichen entfernt.
Ich habe dies bisher auf 2.3 und 3.0 getestet, es ist möglich, dass es noch nicht auf jeder Version funktioniert.
Hier sind zwei Hilfsmethoden, um dies zu tun:
Hier ist ein Beispiel für die Verwendung:
Wenn Sie dies mit einem DialogFragment verwenden, überschreiben Sie die DialogFragments
onCreateDialog
Methode . Erstellen Sie dann Ihren Dialog und geben Sie ihn wie im ersten Beispiel oben zurück. Die einzige Änderung besteht darin, dass Sie false als dritten Parameter (show) übergeben sollten, damit im Dialog nicht show () aufgerufen wird. Das DialogFragment wird das später erledigen.Beispiel:
Wenn ich dies weiter teste, werde ich sicher sein, dass ich mit zusätzlichen Optimierungen aktualisiere.
quelle
Ich weiß nicht, ob diese Frage noch aktuell ist, aber in meinem Fall, als ich von Dialog zu DialogFragment gewechselt bin,
war keine Option, aber ich konnte verwenden
stattdessen mit dem gleichen Ergebnis.
quelle
setStyle(STYLE_NO_TITLE, 0);
) in die onCreate-Methode Ihrer DialogFragment-Klasse eingefügt.Setzen Sie den Titel mit dem Builder auf eine leere Zeichenfolge.
quelle
Setzen Sie das Attribut "Schwerkraft" im gesamten Dialogfeld auf "Mitte". Anschließend müssen Sie diese Einstellung für alle untergeordneten Komponenten im Dialogfeld überschreiben, die nicht zentriert werden sollen.
quelle
quelle
Verwenden Sie in XML ein Thema
quelle
Wenn wir einfach den Dialog ohne das verwenden
setTitle()
, wird das dann dazu beitragen, das Leerzeichen des Titels zu entfernen?quelle
Denken Sie, Sie können dies jetzt einfach verwenden:
quelle
Erstellt einen titellosen Dialog
quelle
quelle
Wenn Sie AlertDialog verwenden,
setTitle()
wird der Titel nicht verwendet, wenn Sie ihn nicht verwendenquelle
Nach ein paar Hackerangriffen habe ich Folgendes zum Laufen gebracht:
quelle
dialog
hiergetResources()
Sie können dies ohne Verwendung tun,
AlertDialog
indem Sie eine neue Klasse definieren, die sich von derDialog
Klasse wie folgt erstreckt:quelle
Hier ist etwas, mit
AlertBuilder
dem Sie den Titel verschwinden lassen können:quelle
Benutze das
quelle
dialog_custom .requestWindowFeature (Window.FEATURE_NO_TITLE);
Dadurch wird der Titel aus dem Cutsom-Dialogfeld entfernt.
Beachten Sie, dass Sie diese Zeile hinzufügen, bevor Sie Inhalte hinzufügen
quelle