¿Cómo puedo obtener una ventana de actividad de estilo de diálogo para llenar la pantalla?


142

Estoy usando una actividad con el conjunto de temas de diálogo y quiero que sea a pantalla completa. Intenté todo tipo de cosas, incluso a través del WindowManager para expandir la ventana a todo el ancho y alto manualmente, pero nada funciona.

Aparentemente, una ventana de diálogo (o una actividad con el tema del diálogo) solo se expandirá de acuerdo con su contenido, pero incluso eso no siempre funciona. Por ejemplo, muestro un círculo de barra de progreso que tiene el ancho y la altura establecidos en FILL_PARENT (también lo hace su contenedor de diseño), pero aún así, el diálogo se ajusta alrededor de la barra de progreso mucho más pequeña en lugar de llenar la pantalla.

Debe haber una forma de mostrar algo pequeño dentro de una ventana de diálogo, pero ¿debe expandirse a tamaño de pantalla completa sin que su contenido cambie de tamaño también?


2
Nota interesante: al establecer el ancho y la altura del contenedor de diseño en un valor real en píxeles, el cuadro de diálogo cambia de tamaño en consecuencia. Pero al configurarlo en FILL_PARENT, entonces no ...
Matthias

De Verdad? El diseño de la actividad está instanciando, ¿tiene una etiqueta Relative o LinearLayout principal establecida en alto y ancho de fill_parent? He implementado algunas actividades con un tema de diálogo y nunca tuve un problema con que ocupe toda la pantalla.
MattC

Sí, la actividad tiene un LinearLayout establecido en FILL_PARENT para ancho y alto.
Matthias

Resolví el problema utilizando una solución alternativa, pero como esta no es una buena solución, dejaré la pregunta abierta. Lo que hice fue subclasificar LinearLayout y anular su método onMeasure (), que es responsable de determinar el tamaño de la vista durante un ciclo de diseño y fijarlo al ancho y alto de la pantalla. Sin embargo, esto no es correcto, ya que no tiene en cuenta el espacio ocupado por las barras de menú, por lo que el contenedor será más alto de lo que parece en la pantalla (con todos los efectos secundarios extraños como niños desapareciendo en áreas no visibles de la pantalla).
Matthias

Encontré la solución correcta, mira mi respuesta a continuación.
Matthias

Respuestas:


312

Encontré la solución:

En su actividad que tiene el Theme.Dialogestilo establecido, haga esto:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.your_layout);

    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

Es importante que llame Window.setLayout() después de llamar setContentView(), de lo contrario no funcionará.


55
Gracias, ahorré mi tiempo, ¡en ningún lugar lo habría resuelto! pero alguna idea de por qué tenemos que especificar explícitamente en el código, ¿por qué fill_parent no funciona a través de xml para actividades con diálogo de tema?
sentaron

3
Mi cuadro de diálogo no llenará el ancho, ni por XML ni por este método Me estoy comiendo las uñas.
Eitama

66
Y es:import android.view.ViewGroup.LayoutParams;

11
FILL_PARENT está en desuso ahora, use MATCH_PARENT en su lugar
AlexV

44
No está llenando toda la pantalla, es como si tuviera un pequeño relleno en cada lado.
Machado

66

Puede agregar estos valores a su estilo android: windowMinWidthMajor y android: windowMinWidthMinor

<style name="Theme_Dialog" parent="android:Theme.Holo.Dialog">
    ...
    <item name="android:windowMinWidthMajor">97%</item>
    <item name="android:windowMinWidthMinor">97%</item>
</style>

2
La solución más fácil. También está trabajando con la biblioteca de soporte de appcompat. Gracias.
Muhammad Saqib

Esto debe ser aceptado respuesta. La forma más adecuada y limpia de hacerlo. Considere usar parent = "@ style / Theme.AppCompat.Light.Dialog"
Kirill Karmazin el

Parece que debería funcionar, pero no lo es para mí. Hmm, me pregunto por qué. Quizás las cosas han cambiado desde 2014.
Scott Biggs

53

Solo quiero llenar solo el 80% de la pantalla para eso, me gustó esto a continuación

        DisplayMetrics metrics = getResources().getDisplayMetrics();
        int screenWidth = (int) (metrics.widthPixels * 0.80);

        setContentView(R.layout.mylayout);

        getWindow().setLayout(screenWidth, LayoutParams.WRAP_CONTENT); //set below the setContentview

funciona solo cuando pongo la ventana getwindow (). setLayout ... debajo de setContentView (..)

gracias @Matthias


11

Envuelva su dialog_custom_layout.xml en RelativeLayout en lugar de cualquier otro diseño . Eso funcionó para mí.


1
Lo mismo aquí, Ancho y Altura estaban completamente equivocados y no podían encontrar la manera de arreglarlo. ¡Convertir el diseño raíz a un RelativeLayout también solucionó mis problemas!
SharpMobileCode

8

Para Diálogo Esto puede ser útil para alguien. Quiero un cuadro de diálogo para ocupar todo el ancho de la pantalla. busqué mucho pero nada fue útil. Finalmente esto funcionó para mí:

mDialog.setContentView(R.layout.my_custom_dialog);
mDialog.getWindow().setBackgroundDrawable(null);

después de agregar esto, mi cuadro de diálogo aparece en todo el ancho de la pantalla.


5

Esta respuesta es una solución para aquellos que usan "Theme.AppCompat.Dialog" o cualquier otro descendiente de "Theme.AppCompat.Dialog" como "Theme.AppCompat.Light.Dialog", "Theme.AppCompat.DayNight.Dialog", etc. Yo mismo tengo que usar el cuadro de diálogo AppCompat porque uso AppCompatActivity como extensión para todas mis actividades. Habrá un problema que hará que el diálogo tenga relleno en todos los lados (arriba, derecha, abajo e izquierda) si usamos la respuesta aceptada.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.your_layout);

    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

En el estilo de su actividad, agregue estos códigos

<style name="DialogActivityTheme" parent="Theme.AppCompat.Dialog">
    <item name="windowNoTitle">true</item>
    <item name="android:windowBackground">@null</item>
</style>

Como puede observar, el problema que genera el relleno en nuestro diálogo es "android: windowBackground", así que aquí hago que el fondo de la ventana sea nulo.


2

Establezca un ancho mínimo en el diseño más superior.

android:minWidth="300dp"

Por ejemplo:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="300dp">

<!-- Put remaining contents here -->

</LinearLayout>

2

La respuesta de Matthias es en su mayoría correcta, pero aún no llena toda la pantalla ya que tiene un pequeño relleno en cada lado (señalado por @Holmes). Además de su código, podríamos solucionarlo extendiendo el estilo Theme.Dialog y agregando algunos atributos como este.

<style name="MyDialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowNoTitle">true</item>
</style>

Luego simplemente declaramos Actividad con el tema establecido en MyDialog:

<activity
    android:name=".FooActivity"
    android:theme="@style/MyDialog" />

1

Esto sería útil para alguien como yo. Crear estilo de diálogo personalizado:

<style name="MyDialog" parent="Theme.AppCompat.Light.Dialog">
    <item name="windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowIsFloating">false</item>
</style>

En AndroidManifest.xmlel tema del conjunto de archivos para la actividad deseada:

<activity
        android:name=".CustomDialog"
        ...
        android:theme="@style/MyDialog"/>

Eso es todo, no es necesario llamar a los métodos programáticamente.


aún muestran relleno en cada lado (arriba, derecha, abajo y de izquierda) y si es necesario para mostrar la barra de estado también, esta solución fallará
HendraWD

Consulte stackoverflow.com/a/39590004/3940133 si tiene relleno en cada lado
HendraWD

0

En su archivo de manifiesto donde se define nuestra actividad

<activity
        android:name=".YourPopUpActivity"
        android:theme="@android:style/Theme.Holo.Dialog" >
    </activity>

sin barra de acción

<activity android:name=".YourPopUpActivity"
            android:theme="@android:style/Theme.Holo.Dialog.NoActionBar"/>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.