¿Cómo hacer que un diálogo de alerta llene el 90% del tamaño de la pantalla?

Puedo crear y mostrar un diálogo de alerta personalizado muy bien, pero aun así tengo android:layout_width/height="fill_parent" en el cuadro de diálogo xml, que es solo tan grande como el contenido.

Lo que quiero es un diálogo que llene toda la pantalla, excepto quizás un relleno de 20 píxeles. Luego, la imagen que forma parte del cuadro de diálogo se extenderá automáticamente al tamaño completo del cuadro de diálogo con fill_parent.

De acuerdo con el desarrollador de la plataforma Android, Dianne Hackborn, en esta publicación grupal de debate, Dialogs establece el ancho y alto de diseño de su ventana en WRAP_CONTENT . Para MATCH_PARENT diálogo, puede establecer esos parámetros en MATCH_PARENT .

Código de demostración:

  AlertDialog.Builder adb = new AlertDialog.Builder(this); Dialog d = adb.setView(new View(this)).create(); // (That new View is just there to have something inside the dialog that can grow big enough to cover the whole screen.) WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); lp.copyFrom(d.getWindow().getAttributes()); lp.width = WindowManager.LayoutParams.MATCH_PARENT; lp.height = WindowManager.LayoutParams.MATCH_PARENT; d.show(); d.getWindow().setAttributes(lp); 

Tenga en cuenta que los atributos se establecen después de que se muestre el cuadro de diálogo. El sistema es complejo acerca de cuándo están configurados. (Supongo que el motor de diseño debe establecerlos la primera vez que se muestra el cuadro de diálogo, o algo así.)

Sería mejor hacer esto extendiendo Theme.Dialog, entonces no tendrías que jugar un juego de adivinanzas sobre cuándo llamar a setAttributes. (Aunque es un poco más difícil que el diálogo adopte automáticamente un tema claro u oscuro apropiado, o el tema Honeycomb Holo. Eso se puede hacer de acuerdo con http://developer.android.com/guide/topics/ui/themes. html # SelectATheme )

Intente envolver su diseño de diálogo personalizado en RelativeLayout en lugar de LinearLayout . Eso funcionó para mí.

Especificar FILL_PARENT en la ventana de diálogo, como otros sugirieron, no funcionó para mí (en Android 4.0.4), porque simplemente estiró el fondo del diálogo negro para llenar toda la pantalla.

Lo que funciona bien es usar el valor de visualización mínimo, pero especificarlo dentro del código, de modo que el diálogo ocupe el 90% de la pantalla.

Asi que:

 Activity activity = ...; AlertDialog dialog = ...; // retrieve display dimensions Rect displayRectangle = new Rect(); Window window = activity.getWindow(); window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle); // inflate and adjust layout LayoutInflater inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layout = inflater.inflate(R.layout.your_dialog_layout, null); layout.setMinimumWidth((int)(displayRectangle.width() * 0.9f)); layout.setMinimumHeight((int)(displayRectangle.height() * 0.9f)); dialog.setView(layout); 

En general, solo ajustar el ancho debería ser suficiente en la mayoría de los casos.

Configure android:minWidth y android:minHeight en su vista personalizada xml. Estos pueden forzar la alerta no solo para ajustar el tamaño del contenido. Usando una vista como esta debería hacerlo:

    
 dialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 

Incluso más simple simplemente haz esto:

 int width = (int)(getResources().getDisplayMetrics().widthPixels*0.90); int height = (int)(getResources().getDisplayMetrics().heightPixels*0.90); alertDialog.getWindow().setLayout(width, height); 

Todas las otras respuestas aquí tienen sentido, pero no cumplieron con lo que Fabian necesita. Aquí hay una solución mía. Puede que no sea la solución perfecta pero funciona para mí. Muestra un cuadro de diálogo que está en pantalla completa, pero puede especificar un relleno en la parte superior, inferior, izquierda o derecha.

Primero ponga esto en res / values ​​/ styles.xml:

  

Como puedes ver, tengo Android aquí: paddingTop = 20dp es básicamente lo que necesitas. El android: windowBackground = @ color / Black0Percent es solo un código de color declarado en mi color.xml

res / values ​​/ color.xml

   #00000000  

Ese código de Color solo sirve como un maniquí para reemplazar el fondo predeterminado de la ventana del Diálogo con un 0% de color de transparencia.

A continuación comstack el diseño de diálogo personalizado res / layout / dialog.xml

      

Finalmente, aquí está nuestro diálogo que establece una vista personalizada que usa nuestro dialog.xml:

 Dialog customDialog; LayoutInflater inflater = (LayoutInflater) getLayoutInflater(); View customView = inflater.inflate(R.layout.dialog, null); // Build the dialog customDialog = new Dialog(this, R.style.CustomDialog); customDialog.setContentView(customView); customDialog.show(); 

Conclusión: Intenté anular el tema del diálogo en el archivo styles.xml denominado CustomDialog. Anula el diseño de la ventana de Diálogo y me da la oportunidad de establecer un relleno y cambiar la opacidad del fondo. Puede que no sea la solución perfecta, pero espero que te ayude … 🙂

Puede usar porcentajes para (SOLO) ancho de diálogo de Windows.

Mire este ejemplo del Tema Holo:

   65% 

Todo lo que necesita hacer es extender este tema y cambiar los valores de “Mayor” y “Menor” a 90% en lugar de 65%.

Saludos.

Solución con un cálculo real del 90%:

 @Override public void onStart() { Dialog dialog = getDialog(); if (dialog != null) { dialog.getWindow() .setLayout((int) (getScreenWidth(getActivity()) * .9), ViewGroup.LayoutParams.MATCH_PARENT); } } 

donde getScreenWidth(Activity activity) se define de la siguiente manera (mejor puesto en una clase de Utils):

 public static int getScreenWidth(Activity activity) { Point size = new Point(); activity.getWindowManager().getDefaultDisplay().getSize(size); return size.x; } 

Lo siguiente funcionó bien para mí:

   

(Nota: windowMinWidthMajor / Minor como se sugirió en las respuestas anteriores no funcionó. Mis diálogos siguieron cambiando de tamaño dependiendo del contenido)

y entonces:

 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.MyAlertDialogTheme); 

Bueno, tienes que establecer el alto y el ancho de tu cuadro de diálogo para mostrar esto (dialog.show ())

Entonces, haz algo como esto:

 dialog.getWindow().setLayout(width, height); //then dialog.show() 

Por mucho, la forma más simple en que puedo pensar –

Si su cuadro de diálogo está formado por un LinearLayout vertical, simplemente agregue una vista ficticia de “altura de llenado”, que ocupará toda la altura de la pantalla.

Por ejemplo –

        

Observe el android:weightSum="1" en los atributos de LinearLayout y el android:layout_weight="1" en los atributos de la vista ficticia

Bueno, tienes que establecer el alto y el ancho de tu cuadro de diálogo para mostrar esto (dialog.show ())

Entonces, haz algo como esto:

 dialog.getWindow().setLayout(width, height); //then dialog.show() 

Al obtener este código, lo hice algunos cambios:

 dialog.getWindow().setLayout((int)(MapGeaGtaxiActivity.this.getWindow().peekDecorView().getWidth()*0.9),(int) (MapGeaGtaxiActivity.this.getWindow().peekDecorView().getHeight()*0.9)); 

sin embargo, el tamaño del diálogo podría cambiar cuando el dispositivo cambie su posición. Tal vez deba manejarlo por su cuenta cuando cambien las métricas. PD: peekDecorView, implica que el diseño en la actividad está inicializado correctamente; de ​​lo contrario, puede usar

 DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); int height = metrics.heightPixels; int wwidth = metrics.widthPixels; 

para obtener tamaño de pantalla

Después de inicializar su objeto de diálogo y establecer la vista de contenido. Haz esto y disfruta.

(en el caso estoy configurando el 90% del ancho y el 70% de la altura porque el ancho del 90% será sobre la barra de herramientas)

 DisplayMetrics displaymetrics = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); int width = (int) ((int)displaymetrics.widthPixels * 0.9); int height = (int) ((int)displaymetrics.heightPixels * 0.7); d.getWindow().setLayout(width,height); d.show(); 

Mi respuesta se basa en la de Koma, pero no requiere sobrescribir onStart, sino solo onCreateView, que casi siempre se reemplaza de manera predeterminada cuando se crean nuevos fragmentos.

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.your_fragment_layout, container); Rect displayRectangle = new Rect(); Window window = getDialog().getWindow(); window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle); v.setMinimumWidth((int)(displayRectangle.width() * 0.9f)); v.setMinimumHeight((int)(displayRectangle.height() * 0.9f)); return v; } 

Lo probé en Android 5.0.1.

Arriba, muchas de las respuestas son buenas, pero ninguna de ellas me funcionó por completo. Así que combiné la respuesta de @nmr y obtuve esta.

 final Dialog d = new Dialog(getActivity()); // d.getWindow().setBackgroundDrawable(R.color.action_bar_bg); d.requestWindowFeature(Window.FEATURE_NO_TITLE); d.setContentView(R.layout.dialog_box_shipment_detail); WindowManager wm = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE); // for activity use context instead of getActivity() Display display = wm.getDefaultDisplay(); // getting the screen size of device Point size = new Point(); display.getSize(size); int width = size.x - 20; // Set your heights int height = size.y - 80; // set your widths WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); lp.copyFrom(d.getWindow().getAttributes()); lp.width = width; lp.height = height; d.getWindow().setAttributes(lp); d.show(); 

Aquí está mi variante para el ancho del diálogo personalizado:

 DisplayMetrics displaymetrics = new DisplayMetrics(); mActivity.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); int width = (int) (displaymetrics.widthPixels * (ThemeHelper.isPortrait(mContext) ? 0.95 : 0.65)); WindowManager.LayoutParams params = getWindow().getAttributes(); params.width = width; getWindow().setAttributes(params); 

De modo que, dependiendo de la orientación del dispositivo ( ThemeHelper.isPortrait(mContext) ), el ancho del diálogo será 95% (para el modo retrato) o 65% (para el paisaje). Es un poco más de lo que el autor preguntó, pero podría ser útil para alguien.

onCreate(Bundle savedInstanceState) crear una clase que se extienda desde Diálogo y poner este código en su onCreate(Bundle savedInstanceState) .

Para la altura del diálogo, el código debería ser similar a esto.

 public static WindowManager.LayoutParams setDialogLayoutParams(Activity activity, Dialog dialog) { try { Display display = activity.getWindowManager().getDefaultDisplay(); Point screenSize = new Point(); display.getSize(screenSize); int width = screenSize.x; WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); layoutParams.copyFrom(dialog.getWindow().getAttributes()); layoutParams.width = (int) (width - (width * 0.07) ); layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; return layoutParams; } catch (Exception e) { e.printStackTrace(); return null; } } 
  ... AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); Dialog d = builder.create(); //create Dialog d.show(); //first show DisplayMetrics metrics = new DisplayMetrics(); //get metrics of screen getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); int height = (int) (metrics.heightPixels*0.9); //set height to 90% of total int width = (int) (metrics.widthPixels*0.9); //set width to 90% of total d.getWindow().setLayout(width, height); //set layout 

Aquí hay una respuesta breve que funcionó para mí (Probado en API 8 y API 19).

 Dialog mDialog; View mDialogView; ... // Get height int height = mDialog.getWindow() .getWindowManager().getDefaultDisplay() .getHeight(); // Set your desired padding (here 90%) int padding = height - (int)(height*0.9f); // Apply it to the Dialog mDialogView.setPadding( // padding left 0, // padding top (90%) padding, // padding right 0, // padding bottom (90%) padding); 

Obtenga el ancho del dispositivo:

 public static int getWidth(Context context) { DisplayMetrics displayMetrics = new DisplayMetrics(); WindowManager windowmanager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); windowmanager.getDefaultDisplay().getMetrics(displayMetrics); return displayMetrics.widthPixels; } 

luego use eso para hacer un diálogo del 90% del dispositivo,

 Dialog filterDialog = new Dialog(context, R.style.searchsdk_FilterDialog); filterDialog.setContentView(R.layout.searchsdk_filter_popup); initFilterDialog(filterDialog); filterDialog.setCancelable(true); filterDialog.getWindow().setLayout(((getWidth(context) / 100) * 90), LinearLayout.LayoutParams.MATCH_PARENT); filterDialog.getWindow().setGravity(Gravity.END); filterDialog.show(); 

necesita usar un style @ style.xml como CustomDialog para mostrar el cuadro de diálogo personalizable.

  

y usa este estilo en Activity.java como este

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

y su custom_dialog.xml debería estar dentro de su directorio de diseño

           
 dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.WRAP_CONTENT); 
  final AlertDialog alertDialog; LayoutInflater li = LayoutInflater.from(mActivity); final View promptsView = li.inflate(R.layout.layout_dialog_select_time, null); RecyclerView recyclerViewTime; RippleButton buttonDone; AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(mActivity); alertDialogBuilder.setView(promptsView); // create alert dialog alertDialog = alertDialogBuilder.create(); /** * setting up window design */ alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); alertDialog.show(); DisplayMetrics metrics = new DisplayMetrics(); //get metrics of screen mActivity.getWindowManager().getDefaultDisplay().getMetrics(metrics); int height = (int) (metrics.heightPixels * 0.9); //set height to 90% of total int width = (int) (metrics.widthPixels * 0.9); //set width to 90% of total alertDialog.getWindow().setLayout(width, height); //set layout recyclerViewTime = promptsView.findViewById(R.id.recyclerViewTime); DialogSelectTimeAdapter dialogSelectTimeAdapter = new DialogSelectTimeAdapter(this); RecyclerView.LayoutManager linearLayoutManager = new LinearLayoutManager(this); recyclerViewTime.setLayoutManager(linearLayoutManager); recyclerViewTime.setAdapter(dialogSelectTimeAdapter); buttonDone = promptsView.findViewById(R.id.buttonDone); buttonDone.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { alertDialog.dismiss(); } });