Android: ¿Cómo crear un cuadro de diálogo sin título?

269

Estoy tratando de generar un diálogo personalizado en Android. Creo mi diálogo así:

dialog = new Dialog(this);
dialog.setContentView(R.layout.my_dialog);

Todo funciona bien, excepto el título del Diálogo. Incluso si no configuro el título del cuadro de diálogo, la ventana emergente del cuadro de diálogo tiene un espacio en blanco en la posición del cuadro de diálogo.

¿Hay alguna forma de ocultar esta parte del Diálogo?

Lo probé con un AlertDialog pero parece que el diseño no está configurado correctamente:

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);

Si uso este código, obtengo una excepción de puntero nula en la última línea. El diálogo no es nulo, por lo que el TextView que intento recuperar no existe.
Si elimino el comentario de la parte en la que uso el Constructor de diálogos, todo funciona bien, excepto el título que se encuentra sobre mi diseño de diálogo.

Janusz
fuente
77
@ Janusz vuelve a elegir su respuesta a stackoverflow.com/a/3407871/632951
Pacerier
intente stackoverflow.com/questions/6263639/… en lugar de la respuesta anterior ... respuesta simple
Mohammed mansoor
Simplemente no llame a AlertDialog.Builder.setTitle () y su cuadro de diálogo aparecerá sin título.
Marvatron

Respuestas:

208

Puede ocultar el título de un diálogo usando:

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);


Versión anterior de esta respuesta, que es demasiado complicada:

Necesitas usar un AlertDialog. Hay una buena explicación en el sitio del desarrollador de Android sobre diálogos personalizados .

En resumen muy breve, lo haces con el código que se copia a continuación del sitio web oficial. Eso toma un archivo layot ​​personalizado, lo infla, le da texto e íconos básicos y luego lo crea. Entonces lo mostrarías con 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();

En respuesta al comentario:

Supongo que TextView con la identificación nrestá en la Vista con la que está inflando View view = inflater..... Si es así, entonces necesita cambiar solo un bit: en lugar de dialog.findView...hacerlo view.findView.... Luego, una vez que haya hecho eso, recuerde usar dialog.show (), o incluso builder.show () sin molestarse en hacer builder.create ().

Steve Haley
fuente
44
Creo que puede haber leído mal la pregunta? Janusz ya tiene el cuadro de diálogo personalizado que se muestra y solo requiere información sobre cómo eliminar el título
Donal Rafferty
17
Bueno, de acuerdo con la documentación oficial, "Un diálogo hecho con la clase de Diálogo base debe tener un título. Si no llama a setTitle (), el espacio utilizado para el título permanece vacío, pero aún visible. Si no lo hace" Si no desea un título, debe crear su diálogo personalizado utilizando la clase AlertDialog ". No he experimentado personalmente con él, pero eso sugeriría que incluso usando un diseño de diálogo personalizado o temas, es imposible eliminar el espacio del título.
Steve Haley el
2
Segundo pensamiento: creo que estamos entendiendo el "título" de manera diferente. Supongo que está hablando del espacio en la parte superior de la ventana emergente, no del título en la parte superior de la aplicación.
Steve Haley el
11
@SteveHaley, No, es posible ocultarlo usando la siguiente líneadialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Sami Eltamawy
1
Asegúrese de hacer dialog.requestWindowFeature (Window.FEATURE_NO_TITLE); ANTES de inflar su vista de diálogo.
Alexey Podlasov
585

FEATURE_NO_TITLE funciona al crear un diálogo desde cero, como en:

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

Pero no funciona al crear un AlertDialog (o al usar el Generador), porque ya deshabilita el título y usa uno personalizado internamente.

He examinado las fuentes del SDK y creo que no se puede solucionar. Entonces, para eliminar el espacio superior, la única solución es crear un diálogo personalizado desde cero IMO, utilizando la clase Dialog directamente.

Además, se puede hacer eso con un estilo, por ejemplo, en styles.xml:

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

Y entonces:

Dialog dialog = new Dialog(context, R.style.FullHeightDialog);
olivierg
fuente
En lugar de crear un diálogo personalizado desde cero, creé el styles.xml como lo sugiere oliverg. Y luego, agregué android: theme = "@ style / FullHeightDialog" a la declaración <activity> ... </acitivity> en el archivo Manifiesto. Simplemente funcionó. Gracias ..
Indrajeet
@olivierg pero quiero un botón con un cuadro de diálogo de altura completa. ¿cual es la solución?
Pacerier
1
Tenga en cuenta que la línea requestWindowFeature debe estar ANTES de la línea setContentView.
Fattie
Si bien esto responde mejor a los comentarios reales, la solución en la respuesta aceptada es la mejor en mi opinión. Empecé haciéndolo así, con una limpieza Dialog, pero crear una AlertDialogfue mucho más fácil. Como se afirma en los documentos : 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>. El AlertDialogtambién maneja cosas del ciclo de vida y ok / cancel de manera fácil.
Krøllebølle
67

En su código agregue esta línea

requestWindowFeature(Window.FEATURE_NO_TITLE);  

O en XML usa un tema

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

XML sería una mejor implementación ya que con la versión del código se crea la barra de título y luego se elimina, lo cual es un desperdicio de recursos

Ok, buen intento pero no funciona. Obtengo: android.view.WindowManager $ BadTokenException: no se puede agregar la ventana: el token nulo no es para una aplicación si quiero mostrar el diálogo.

Cambie el tipo de diálogo de alerta al diálogo del sistema (por ejemplo, TYPE_SYSTEM_OVERLAY) y vea si esto resuelve su problema

Donal Rafferty
fuente
2
No llame a setContentView () antes de requestFeature ().
jlopez
61

Usar así:

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

Esto eliminará cualquier barra de título de la ventana de diálogo.

alok tiwari
fuente
3
No llame a setContentView () antes de requestFeature ().
jlopez
2
¿Cómo lo traigo más tarde?
Desarrollador de Android
58

Use el siguiente código antes setcontentview: -

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

Nota : debe tener el código anterior, en el mismo orden y línea. requestWindowFeaturedebe estar antes de la línea setContentView.

duggu
fuente
Cuando se usa en un Dialogfragment, esta solución funciona mejor para mí, ya que la respuesta aceptada crea un pequeño espacio vertical entre el cuadro de diálogo y la vista de contenido interno.
Sebastian Roth
38

puedes quitar el título

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

donde diálogo es el nombre de mi diálogo.

shailendra
fuente
No llame a setContentView () antes de requestFeature ()
jlopez
29

En su código, si lo usa, requestWindowFeature(Window.FEATURE_NO_TITLE); asegúrese de que vaya antes, de lo dialog.setContentView();contrario, la aplicación se bloqueará.

Szymon Morawski
fuente
Más bien dudo en probar antes y bastante sorprendido de que obviamente funcione. ya que en android.developer.com dijeron claramente que es imprescindible que un diálogo personalizado tenga un título. : P
richardlin
10

Encontré Three Way para hacer esto>

1) Usando requestWindowFeature

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

2) Usando estilo (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) Uso del tema XML en AndroidManifest.xml

 android:theme="@android:style/Theme.NoTitleBar"
Nirav Ranpara
fuente
1
El método uno debería ser dialog.requestWindowFeature (Window.FEATURE_NO_TITLE);
Jon Willis
10

En su clase Custom_Dialog.java agregue 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
fuente
Esto es lo único que funcionó para mí ... por alguna razón, todas las otras sugerencias no funcionaron. Lo único que recomendaría es hacer público el constructor y también proporcionar el otro constructor de Diálogo que solo toma un Contexto
Justin
7

La respuesta de olivierg funcionó para mí y es la mejor solución si crear una clase de Diálogo personalizada es la ruta que desea seguir. Sin embargo, me molestó que no pudiera usar la clase AlertDialog. Quería poder usar el estilo predeterminado del sistema AlertDialog. Crear una clase de diálogo personalizada no tendría este estilo.

Así que encontré una solución (hack) que funcionará sin tener que crear una clase personalizada, puede usar los constructores existentes.

AlertDialog coloca una Vista sobre su vista de contenido como un marcador de posición para el título. Si encuentra la vista y establece la altura en 0, el espacio desaparece.

He probado esto en 2.3 y 3.0 hasta ahora, es posible que todavía no funcione en todas las versiones.

Aquí hay dos métodos de ayuda para hacerlo:

/**
 * 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;
}

Aquí hay un ejemplo de cómo se usa:

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

    showDialogWithNoTopSpace(yourCustomView, dialog, true);

Si está utilizando esto con un DialogFragment, anule el onCreateDialogmétodo del DialogFragment . Luego cree y devuelva su diálogo como el primer ejemplo anterior. El único cambio es que debe pasar falso como el tercer parámetro (show) para que no llame a show () en el cuadro de diálogo. El DialogFragment se encargará de eso más tarde.

Ejemplo:

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

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

A medida que lo pruebe más, me aseguraré de actualizar con cualquier ajuste adicional necesario.

cottonBallPaws
fuente
Solución elegante, +1. ¿Sabes cómo usar esto en un DialogFragment?
Binoy Babu
@Binoy actualizó la respuesta para DialogFragments (así es como lo uso personalmente)
cottonBallPaws
6

No sé si esta pregunta sigue siendo real, pero en mi caso, cuando cambié de Dialog a DialogFragment,

requestWindowFeature(Window.FEATURE_NO_TITLE);

no era una opción, pero podría usar

setStyle(STYLE_NO_TITLE, 0);

en cambio con el mismo resultado.

Analizador
fuente
Para aclarar, esta línea ( setStyle(STYLE_NO_TITLE, 0);) irá en el método onCreate de su clase DialogFragment.
Precio
4

Establezca el título para vaciar la cadena usando el generador.

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

establezca el atributo "gravedad" en todo el cuadro de diálogo en "centro". Luego, deberá anular esa configuración para todos los componentes secundarios en el cuadro de diálogo que no desea centrar.

Mate
fuente
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
fuente
3

en XML usa un tema

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

Si simplemente usamos el cuadro de diálogo sin el setTitle(), ¿funcionará eso para eliminar el espacio del título?

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

Creo que puedes usar esto ahora:

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

crea un cuadro de diálogo sin título

Praveen Kondapalli
fuente
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
fuente
2

Mientras usa AlertDialog, no usarlo setTitle()hace que el título desaparezca

kostikus
fuente
1

Después de un montón de piratería, conseguí que esto funcione:

            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
fuente
qué hay dialogaquí ygetResources()
Kartheek s
1

Puede hacer esto sin usar AlertDialogdefiniendo una nueva Clase que se extienda desde la DialogClase de esta manera:

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

Aquí hay algo que puede hacer AlertBuilderpara que el título desaparezca:

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

Utilizar este

    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
fuente
0

dialog_custom .requestWindowFeature (Window.FEATURE_NO_TITLE);

esto eliminará el título del cuadro de diálogo de cutom.

Nota agregue estas líneas antes de agregar contenido ... por ejemplo

     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
fuente