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

Estoy intentando generar un diálogo personalizado en Android. Creo mi Diálogo así:

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

Everythings funciona bien, excepto para el título del Diálogo. Incluso si no establezco el título del diálogo, el cuadro de diálogo tiene un espacio en blanco en la posición del 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á bien configurado:

 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 utilizo este código, obtengo una excepción de puntero nula en la última línea. El cuadro de diálogo no es nulo, por lo que el TextView que intento recuperar no existe.
Si descomente la parte donde utilizo el constructor de diálogo todo funciona bien, pero para el título de arriba de mi diseño de diálogo.

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

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);


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

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

En un resumen muy breve, usted hace esto con el código como copiado a continuación desde el sitio web oficial. Que toma un archivo layot ​​personalizado, lo infla, le da un poco de texto básico y el icono, a continuación, crea. Lo mostraría 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:

Asumo que TextView con el nr del id está en la visión que usted está inflando con la View view = inflater.... Si es así, entonces necesitas cambiar solo un bit: en lugar de dialog.findView... make it view.findView... Entonces, una vez que haya hecho eso, recuerde usar dialog.show (), o incluso builder.show () sin molestarse en hacer builder.create ().

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 cuando se crea un AlertDialog (o usando el Builder), ya que ya deshabilita el título y utiliza uno personalizado internamente.

He mirado las fuentes del SDK, y creo que no se puede resolver. Así que para eliminar el espaciado superior, la única solución es crear un cuadro de diálogo personalizado desde cero IMO, utilizando la clase de diálogo 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); 

En su código, agregue esta línea

 requestWindowFeature(Window.FEATURE_NO_TITLE); 

O en XML utilizar un tema

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

XML sería una mejor aplicación como con la versión de código de la barra de título se crea y luego se elimina que es un desperdicio de recursos

Ok, buen intento, pero no está funcionando. Tengo: android.view.WindowManager $ BadTokenException: No se puede agregar window-token null no es para una aplicación si quiero shwo el diálogo.

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

Utilizar de esta manera:

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

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

Utilice el siguiente código antes de 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. requestWindowFeature debe estar antes de la línea setContentView.

Usted puede quitar el título por

 dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 

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

En su código si utiliza requestWindowFeature(Window.FEATURE_NO_TITLE); Asegúrese de que va antes de dialog.setContentView(); De lo contrario hace que la aplicación se bloquee.

Encontré tres manera de hacer esto>

1) Usando requestWindowFeature

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

2) Uso de 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" 

En su clase Custom_Dialog.java, añada 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 } } 

La respuesta de olivierg funcionó para mí y es la mejor solución si la creación de una clase de diálogo personalizada es la ruta que desea ir. Sin embargo, me molestaba que no pudiera usar la clase AlertDialog. Quería poder utilizar 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 funciona sin tener que crear una clase personalizada, puede utilizar los constructores existentes.

El AlertDialog coloca una vista encima de 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 no funciona en cada versión todavía.

Aquí hay dos métodos auxiliares 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; } 

A continuación se muestra un ejemplo de cómo se utiliza:

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

Si está utilizando esto con un DialogFragment, anule el método onCreateDialog del onCreateDialog . A continuación, crear y devolver su diálogo como el primer ejemplo anterior. El único cambio es que debes pasar falso como el tercer parámetro (show) para que no llame a show () en el diálogo. El DialogFragment se encargará de ello más adelante.

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 pruebe esto más que voy a estar seguro de actualizar con cualquier ajustes adicionales necesarios.

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 lugar con el mismo resultado.

Defina el título como cadena vacía mediante el constructor.

  Builder builder = new AlertDialog.Builder(context); builder.setTitle(""); ... builder.show(); 

Establezca el atributo "gravedad" en todo el diálogo a "centro". Entonces tendrá que anular esa configuración a todos los componentes secundarios en el cuadro de diálogo que no desea centrado.

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

En XML utilice un tema

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

Si simplemente usamos el diálogo sin el setTitle() , entonces ¿eso va a funcionar en la eliminación del 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(); 

Piensa que puedes usar esto ahora:

 AlertDialog dialog = new AlertDialog.Builder(this) .setView(view) .setTitle("") .create() 

Puede hacer esto sin utilizar AlertDialog definiendo nueva Clase que se extiende desde la clase de Dialog como esto:

 public class myDialog extends Dialog { public myDialog(Context context) { super(context); requestWindowFeature(Window.FEATURE_NO_TITLE); } } 
 ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", "Loading. Please wait...", true); 

Crea un diálogo de título menos

Al usar AlertDialog, no usar setTitle() hace que el título desaparezca

Después de un montón de hacking, tengo esto para trabajar:

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

Aquí hay algo que puedes hacer con AlertBuilder para que desaparezca el título:

 TextView title = new TextView(this); title.setVisibility(View.GONE); builder.setCustomTitle(title); 
  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); 
  • Android: App Compat Theme - Diálogo cuando grande
  • Totalmente transparente ActionBarSherlock utilizando el tema
  • Uso del diálogo de progreso con el hilo
  • ¿Cómo hacer el diálogo de diseño de material de pantalla completa?
  • SendUserActionEvent () mView == null después de hacer clic en el botón
  • Cómo establecer el contenido de setSingleChoiceItems en onPrepareDialog?
  • DialogFragment vs actividad con tema de diálogo
  • ¿Cómo crear un diálogo que se parece exactamente a ContextMenu?
  • Android: formato de fuente en diálogo de alerta
  • ¿Por qué setCanceledOnTouchOutside (false) no funciona en Alert Builder?
  • SetTitle to AppCompatDialog no funciona
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.