Android: Wie erstelle ich einen Dialog ohne Titel?

269

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.

Janusz
quelle
7
@ Janusz wählen Sie Ihre Antwort auf stackoverflow.com/a/3407871/632951
Pacerier
versuchen Sie stackoverflow.com/questions/6263639/… anstelle der vorherigen Antwort ... einfache Antwort
Mohammed Mansoor
Rufen Sie einfach nicht AlertDialog.Builder.setTitle () auf, und Ihr Dialogfeld wird ohne Titel angezeigt.
Marvatron

Antworten:

208

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().

AlertDialog.Builder builder;
AlertDialog alertDialog;

Context mContext = getApplicationContext();
LayoutInflater inflater = (LayoutInflater)
        mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_dialog,
        (ViewGroup) findViewById(R.id.layout_root));

TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("Hello, this is a custom dialog!");
ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.android);

builder = new AlertDialog.Builder(mContext);
builder.setView(layout);
alertDialog = builder.create();

Als Antwort auf den Kommentar:

Ich gehe davon aus, dass sich TextView mit der ID nrin der Ansicht befindet, mit der Sie aufblasen View view = inflater..... Wenn ja, müssen Sie nur ein Bit ändern: anstatt es zu dialog.findView...machen view.findView.... Denken Sie dann daran, dialog.show () oder sogar builder.show () zu verwenden, ohne sich die Mühe zu machen, builder.create () auszuführen.

Steve Haley
quelle
4
Ich denke, Sie haben die Frage möglicherweise falsch verstanden? Janusz hat bereits den benutzerdefinierten Dialog angezeigt und benötigt nur Informationen zum Entfernen des Titels
Donal Rafferty
17
Laut offizieller Dokumentation muss ein mit der Basisdialogklasse erstellter Dialog einen Titel haben. Wenn Sie setTitle () nicht aufrufen, bleibt der für den Titel verwendete Platz leer, aber immer noch sichtbar. Wenn Sie dies nicht tun. Wenn Sie überhaupt keinen Titel möchten, sollten Sie Ihren benutzerdefinierten Dialog mit der AlertDialog-Klasse erstellen. " Ich habe nicht persönlich damit experimentiert, aber das würde darauf hindeuten, dass es selbst bei Verwendung eines benutzerdefinierten Dialoglayouts oder von benutzerdefinierten Themen nicht möglich ist, den Titelbereich zu entfernen.
Steve Haley
2
2. Gedanke: Ich denke, wir verstehen "Titel" anders. Ich nehme an, er spricht über das Leerzeichen oben im Popup-Fenster, nicht über den Titel oben in der App.
Steve Haley
11
@SteveHaley, Nein, es ist möglich, es mit der folgenden Zeile zu verbergendialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Sami Eltamawy
1
Stellen Sie sicher, dass Sie dialog.requestWindowFeature (Window.FEATURE_NO_TITLE) ausführen. BEVOR Sie Ihre Dialogansicht aufblasen.
Alexey Podlasov
585

FEATURE_NO_TITLE funktioniert beim Erstellen eines Dialogfelds von Grund auf wie folgt:

Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

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:

<style name="FullHeightDialog" parent="android:style/Theme.Dialog">
   <item name="android:windowNoTitle">true</item>
</style>

Und dann:

Dialog dialog = new Dialog(context, R.style.FullHeightDialog);
olivierg
quelle
Anstatt ein benutzerdefiniertes Dialogfeld von Grund auf neu zu erstellen, habe ich die Datei styles.xml erstellt, wie von oliverg vorgeschlagen. Und dann habe ich android: theme = "@ style / FullHeightDialog" zur Deklaration <Aktivität> ... </ Aktivität> in der Manifest-Datei hinzugefügt. Es hat einfach funktioniert. Danke ..
Indrajeet
@olivierg aber ich möchte eine Schaltfläche mit einem Dialogfeld voller Höhe. Was ist die Lösung?
Pacerier
1
Beachten Sie, dass die Zeile requestWindowFeature VOR der Zeile setContentView sein muss .
Fattie
Während dies die tatsächlichen Kommentare am besten beantwortet, ist die Lösung in der akzeptierten Antwort meiner Meinung nach die beste. Ich habe so angefangen, mit einem sauberen Dialog, aber das Erstellen eines AlertDialogwar 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>. Das AlertDialogerledigt auch Lebenszyklus-Sachen und ok / stornieren auf einfache Weise.
Krøllebølle
67

Fügen Sie in Ihrem Code diese Zeile hinzu

requestWindowFeature(Window.FEATURE_NO_TITLE);  

Oder verwenden Sie in XML ein Thema

android:theme="@android:style/Theme.NoTitleBar"

XML wäre eine bessere Implementierung, da mit der Codeversion die Titelleiste erstellt und dann entfernt wird, was eine Verschwendung von Ressourcen darstellt

Ok, guter Versuch, aber es funktioniert nicht. Ich erhalte: android.view.WindowManager $ BadTokenException: Fenster kann nicht hinzugefügt werden - Token null ist nicht für eine Anwendung, wenn ich den Dialog anzeigen möchte.

Ändern Sie den Typ des Warnungsdialogs in einen Systemdialog (z. B. TYPE_SYSTEM_OVERLAY) und prüfen Sie, ob dies Ihr Problem behebt

Donal Rafferty
quelle
2
Rufen Sie setContentView () nicht vor requestFeature () auf.
Jlopez
61

Verwenden Sie wie folgt:

Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 

Dadurch werden alle Titelleisten aus dem Dialogfenster entfernt.

alok tiwari
quelle
3
Rufen Sie setContentView () nicht vor requestFeature () auf.
Jlopez
2
Wie bringe ich es später zurück?
Android-Entwickler
58

Verwenden Sie den folgenden Code vor setcontentview: -

    Dialog dialog = new Dialog(this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.setContentView(R.layout.custom_dialog);

Hinweis : Sie müssen den obigen Code in derselben Reihenfolge und Zeile haben. requestWindowFeaturemuss vor der Zeile setContentView stehen.

Duggu
quelle
Bei Verwendung in einem Dialogfragment funktioniert diese Lösung für mich besser, da die akzeptierte Antwort eine winzige vertikale Lücke zwischen dem Dialograhmen und der inneren Inhaltsansicht erzeugt.
Sebastian Roth
38

Sie können den Titel von entfernen

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

Dabei ist Dialog der Name meines Dialogs.

Shailendra
quelle
Rufen Sie setContentView () nicht vor requestFeature ()
jlopez
29

Wenn Sie in Ihrem Code verwenden requestWindowFeature(Window.FEATURE_NO_TITLE); , stellen Sie sicher, dass er vorher ausgeführt wird, da dialog.setContentView();sonst die Anwendung abstürzt.

Szymon Morawski
quelle
Ich bezweifle eher, es vorher zu versuchen und bin ziemlich überrascht, dass es offensichtlich funktioniert. da in android.developer.com klar gesagt wurde, dass es ein Muss für einen benutzerdefinierten Dialog ist, einen Titel zu haben. : P
richardlin
10

Ich habe Three Way gefunden, um dies zu tun>

1) Verwenden von requestWindowFeature

Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(dialog.getWindow().FEATURE_NO_TITLE); 

2) Verwenden von style (style.xml)

<style name="FullHeightDialog" parent="android:style/Theme.Dialog">
   <item name="android:windowNoTitle">true</item>
</style>

Dialog dialog = new Dialog(context, R.style.FullHeightDialog);

3) Verwenden des XML-Themas in AndroidManifest.xml

 android:theme="@android:style/Theme.NoTitleBar"
Nirav Ranpara
quelle
1
Methode eins sollte dialog.requestWindowFeature (Window.FEATURE_NO_TITLE) sein;
Jon Willis
10

Fügen Sie in Ihrer Custom_Dialog.java-Klasse hinzu requestWindowFeature(Window.FEATURE_NO_TITLE)

public class Custom_Dialog extends Dialog {

    protected Custom_Dialog(Context context, int theme) {
        super(context, theme);
        // TODO Auto-generated constructor stub
        requestWindowFeature(Window.FEATURE_NO_TITLE); //This line 
    }
}
M_K
quelle
Dies ist das einzige, was für mich funktioniert hat ... aus irgendeinem Grund haben alle anderen Vorschläge nicht funktioniert. Das einzige, was ich empfehlen würde, ist, den Konstruktor öffentlich zu machen und auch den anderen Dialog-Konstruktor bereitzustellen, der nur einen Kontext verwendet
Justin
7

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:

/**
 * Show a Dialog with the extra title/top padding collapsed.
 * 
 * @param customView The custom view that you added to the dialog
 * @param dialog The dialog to display without top spacing
     * @param show Whether or not to call dialog.show() at the end.
 */
public static void showDialogWithNoTopSpace(final View customView, final Dialog dialog, boolean show) {
    // Now we setup a listener to detect as soon as the dialog has shown.
    customView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {
            // Check if your view has been laid out yet
            if (customView.getHeight() > 0) {
                // If it has been, we will search the view hierarchy for the view that is responsible for the extra space. 
                LinearLayout dialogLayout = findDialogLinearLayout(customView);
                if (dialogLayout == null) {
                    // Could find it. Unexpected.

                } else {
                    // Found it, now remove the height of the title area
                    View child = dialogLayout.getChildAt(0);
                    if (child != customView) {
                        // remove height
                        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams();
                        lp.height = 0;
                        child.setLayoutParams(lp);

                    } else {
                        // Could find it. Unexpected.
                    }
                }

                // Done with the listener
                customView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
         }

    });

    // Show the dialog
    if (show)
             dialog.show();
}

/**
 * Searches parents for a LinearLayout
 * 
 * @param view to search the search from
 * @return the first parent view that is a LinearLayout or null if none was found
 */
public static LinearLayout findDialogLinearLayout(View view) {
    ViewParent parent = (ViewParent) view.getParent();
    if (parent != null) {
        if (parent instanceof LinearLayout) {
            // Found it
            return (LinearLayout) parent;

        } else if (parent instanceof View) {
            // Keep looking
            return findDialogLinearLayout((View) parent);

        }
    }

    // Couldn't find it
    return null;
}

Hier ist ein Beispiel für die Verwendung:

    Dialog dialog = new AlertDialog.Builder(this)
        .setView(yourCustomView)
        .create();

    showDialogWithNoTopSpace(yourCustomView, dialog, true);

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:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new AlertDialog.Builder(getContext())
        .setView(yourCustomView)
        .create();

    showDialogWithNoTopSpace(yourCustomView, dialog, false);
    return dialog;
}

Wenn ich dies weiter teste, werde ich sicher sein, dass ich mit zusätzlichen Optimierungen aktualisiere.

CottonBallPaws
quelle
Elegante Lösung, +1. Wissen Sie, wie Sie dies in einem DialogFragment verwenden können?
Binoy Babu
@ Binoy aktualisiert die Antwort für DialogFragments (so benutze ich es eigentlich persönlich)
CottonBallPaws
6

Ich weiß nicht, ob diese Frage noch aktuell ist, aber in meinem Fall, als ich von Dialog zu DialogFragment gewechselt bin,

requestWindowFeature(Window.FEATURE_NO_TITLE);

war keine Option, aber ich konnte verwenden

setStyle(STYLE_NO_TITLE, 0);

stattdessen mit dem gleichen Ergebnis.

Analizer
quelle
Zur Verdeutlichung wird diese Zeile ( setStyle(STYLE_NO_TITLE, 0);) in die onCreate-Methode Ihrer DialogFragment-Klasse eingefügt.
Preis
4

Setzen Sie den Titel mit dem Builder auf eine leere Zeichenfolge.

    Builder builder = new AlertDialog.Builder(context);
    builder.setTitle("");
...
    builder.show();
Szere Dyeri
quelle
3

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.

Matt
quelle
3
dialog=new Dialog(YourActivity.this, 1);  // to make dialog box full screen with out title.
dialog.setContentView(layoutReference);
dialog.setContentView(R.layout.layoutexample);
Bamadeva
quelle
3

Verwenden Sie in XML ein Thema

android:theme="@android:style/Theme.NoTitleBar"
Asad Rao
quelle
3

Wenn wir einfach den Dialog ohne das verwenden setTitle(), wird das dann dazu beitragen, das Leerzeichen des Titels zu entfernen?

mUSSDDialog = new AlertDialog.Builder(context).setView(dialogView)
.setPositiveButton(R.string.send_button,DialogListener)
.setNegativeButton(R.string.cancel,DialogListener)
.setCancelable(false).create();
jad
quelle
3

Denken Sie, Sie können dies jetzt einfach verwenden:

AlertDialog dialog = new AlertDialog.Builder(this)
  .setView(view)
  .setTitle("")
  .create()
J2K
quelle
2
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", 
                             "Loading. Please wait...", true);

Erstellt einen titellosen Dialog

Praveen Kondapalli
quelle
2
public static AlertDialog showAlertDialogWithoutTitle(Context context,String msg) 
     {
      AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
      alertDialogBuilder.setMessage(msg).setCancelable(false)
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int id) {

         }
        });

       return alertDialogBuilder.create(); 
     }
Sandeep Kumar Patil
quelle
2

Wenn Sie AlertDialog verwenden, setTitle()wird der Titel nicht verwendet, wenn Sie ihn nicht verwenden

kostikus
quelle
1

Nach ein paar Hackerangriffen habe ich Folgendes zum Laufen gebracht:

            Window window = dialog.getWindow();
            View view = window.getDecorView();
            final int topPanelId = getResources().getIdentifier( "topPanel", "id", "android" );
            LinearLayout topPanel = (LinearLayout) view.findViewById(topPanelId);
            topPanel.setVisibility(View.GONE);
Chuck D.
quelle
Was ist dialoghier getResources()
drüben
1

Sie können dies ohne Verwendung tun, AlertDialogindem Sie eine neue Klasse definieren, die sich von der DialogKlasse wie folgt erstreckt:

public class myDialog extends Dialog {
    public myDialog(Context context) {
        super(context);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
    }
}
Khaled AbuShqear
quelle
1

Hier ist etwas, mit AlertBuilderdem Sie den Titel verschwinden lassen können:

TextView title = new TextView(this);
title.setVisibility(View.GONE);
builder.setCustomTitle(title);
rundavidrun
quelle
1

Benutze das

    Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    dialog.setCancelable(true);
    dialog.setContentView(R.layout.image_show_dialog_layout);
Habibur Rahman Ovie
quelle
0

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

     dialog_custom = Dialog(activity!!)
    dialog_custom.requestWindowFeature(Window.FEATURE_NO_TITLE)
    dialog_custom.setContentView(R.layout.select_vehicle_type)
    dialog_custom.setCanceledOnTouchOutside(false)
    dialog_custom.setCancelable(true)
indrajeet jyoti
quelle