2009-09-01 13 views
127

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 pasando por WindowManager para expandir la ventana a ancho y alto completos manualmente, pero nada funciona.¿Cómo puedo obtener una ventana de actividad de estilo de diálogo para llenar la pantalla?

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

Debe haber una manera de mostrar algo pequeño dentro de una ventana de diálogo pero hacer que se expanda a tamaño de pantalla completa sin que su contenido cambie de tamaño también.

+2

Nota interesante: Al ajustar la anchura y la altura del contenedor de diseño a un valor real en píxeles, a continuación, el el diálogo cambia de tamaño según corresponda. Pero al configurarlo en FILL_PARENT, entonces no ... – Matthias

+0

Resolví el problema de alguna manera mediante una solución alternativa, pero como esta no es una buena solución, dejaré la pregunta abierta. Lo que hice fue crear una subclase de 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 esto 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 que desaparecen en áreas no visibles de la pantalla). – Matthias

+0

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

Respuesta

282

he encontrado la solución:

En su actividad que tiene el conjunto Theme.Dialog estilo, hacer 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 se llama a setContentView(), de lo contrario, ganó' t trabajo.

+4

Gracias, salvado mi tiempo, en ninguna parte me hubiera dado cuenta de esto! 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 las actividades con el diálogo del tema? – sat

+3

Mi cuadro de diálogo no rellenará el ancho, no por XML, y no por este método. Me estoy comiendo las uñas. – eitama

+6

Y es: 'import android.view.ViewGroup.LayoutParams;' –

2

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

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> 
46

sólo quiero llenar sólo el 80% de la pantalla para que me ha gustado esta por debajo

 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 

sólo funciona cuando pongo el GetWindow() .setLayout ... línea debajo de setContentView (..)

gracias @Matthias

+1

gracias hermano, exactamente lo que estaba buscando 4. :) –

+1

Muchas gracias ! Esto funcionó para mí :) – Woppi

45

Puede agregar estos valores a su estilo androide: windowMinWidthMajor y Android: windowMinWidthMinor

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

La anchura mínima se permite que sea la ventana, a lo largo del eje menor de la pantalla.

+0

Funcionó perfectamente para mí. Gracias. – PratikGandhi

+1

lo único que funcionó para mí – Murphybro2

+1

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

2

La respuesta de Matthias es correcta, pero aún no llena toda la pantalla, ya que tiene un pequeño margen en cada lado (señalado por @Holmes). Además de su código, podemos solucionar esto ampliando 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> 

entonces simplemente declaran Actividad con juego el tema de MyDialog:

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

para el diálogo Esto puede útil para alguien. Quiero un cuadro de diálogo para tomar el ancho completo de la pantalla. buscó mucho pero nada encontró ú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 toda la anchura de la pantalla.

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.xml archivo de tema conjunto para la actividad deseada:

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

Eso es todo, no hay necesidad de llamar a los métodos programaticaly.

+0

todavía muestran relleno en cada lado (arriba, derecha, abajo e izquierda) y si también necesitamos mostrar la barra de estado, esta solución fallará – HendraWD

1

Esta respuesta es una solución para aquellos que utilizan "Theme.AppCompat.Dialog" o cualquier otro descendientes "Theme.AppCompat.Dialog" como "Theme.AppCompat.Light.Dialog", "Theme.AppCompat.DayNight .Dialog ", etc. Yo mismo tengo que usar el diálogo de AppCompat porque uso AppCompatActivity como se extiende para todas mis actividades. Habrá un problema que hará que el diálogo tenga relleno en cada lado (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, añadir estos códigos

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

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

+0

sí, ese fue mi caso. gracias :) – mohnage7

6

envolver su dialog_custom_layout.xml en RelativeLayout en lugar de cualquier otra layout.That trabajó para mí.

+0

Lo mismo aquí, el ancho y la altura eran completamente incorrectos y no podían encontrar la manera de solucionarlos. La conversión del diseño de la raíz a RelativeLayout también solucionó mis problemas. – SharpMobileCode

0

En el archivo de manifiesto en el que 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"/> 
Cuestiones relacionadas