Actividad de Android como diálogo

257

Tengo una actividad llamada whereActityque también tiene cuadros de diálogo secundarios. Ahora, quiero mostrar esta actividad como un cuadro de diálogo para otra actividad.

¿Cómo puedo hacer eso?

ingrese la descripción de la imagen aquí

d-man
fuente
Si solo desea cargar el diálogo, puede usar ProgressDialog
Daksh Agrawal el

Respuestas:

546

Para comenzar la actividad como diálogo, lo definí así en AndroidManifest.xml:

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

Use esta propiedad dentro de su activityetiqueta para evitar que su cuadro de diálogo aparezca en la lista de aplicaciones utilizadas recientemente

android:excludeFromRecents="true"

Si desea evitar que su diálogo / actividad se destruya cuando el usuario hace clic fuera del diálogo:

Después setContentView() de su Activityuso:

this.setFinishOnTouchOutside(false);

Ahora, cuando lo llamo, startActivity()se muestra como un cuadro de diálogo, con la actividad anterior que se muestra cuando el usuario presiona el botón Atrás.

Tenga en cuenta que si está utilizando ActionBarActivity(o el tema AppCompat), deberá utilizarlo @style/Theme.AppCompat.Dialogen su lugar.

d-man
fuente
186
Usar android: theme = "@ android: style / Theme.Dialog" es el camino a seguir, pero no olvide usar excludeFromRecents = true o su cuadro de diálogo aparecerá en las Aplicaciones utilizadas recientemente (mantenga presionada la tecla Inicio).
Emmanuel
77
tengo dificultades relacionadas con la actividad como diálogo ... hice la actividad como diálogo pero el problema es que cuando hago clic fuera de la actividad se cierra automáticamente ... ??? ¿Hay alguna solución relacionada con esto .. ??????
Wolverine
77
@ Emmanuel, tiene que ser Android: excludeFromRecents = "true" tenga en cuenta las comillas dobles
Sandeep
43
Tenga en cuenta que si está utilizando ActionBarActivity (o el tema AppCompat), deberá usar@style/Theme.AppCompat.Dialog
Quentin Klein
8
@Wolverine, Agregar this.setFinishOnTouchOutside(false);después del setContentView()método para evitar que la actividad se destruya cuando hace clic fuera del cuadro de diálogo que creó.
Anggrayudi H
43

Use este código para que la actividad del diálogo no se cierre cuando el usuario toque fuera del cuadro de diálogo:

this.setFinishOnTouchOutside(false);

requiere API nivel 11

Disidente
fuente
1
¿Hay alguna solución para API <11?
PK Gupta
@pkgupta, si es aceptable para usted, no debería preocuparse al menos API <15 para mí, ya que no hay mucha gente que use esas versiones anteriores de todos modos. De hecho, a partir de 2017, creo que 19 o 20 es el nuevo minSDK.
Neon Warge
28

Puede definir este estilo en values ​​/ styles.xml para realizar un Splash más antiguo:

   <style name="Theme.UserDialog" parent="android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:windowBackground">@drawable/trans</item>
    </style>

Y úsalo AndroidManifest.xml:

   <activity android:name=".SplashActivity"
          android:configChanges="orientation"
          android:screenOrientation="sensor"
          android:theme="@style/Theme.UserDialog">
herbertD
fuente
2
re @drawable/trans: deberías poder usar @android:color/transparentlo que crearía un ColorDrawablepara usar como fondo.
TWiStErRob
1
<item name = "android: windowBackground"> ​​@ null </item> es otra alternativa
TouchBoarder,
El problema es que la actividad está llenando toda la pantalla pero no se muestra como una superposición de diálogo.
Shajeel Afzal el
Es <item name="windowNoTitle">true</item> (no "android"). Ver aquí . No estoy seguro acerca de los otros artículos.
Gary99
23

1 - Puede usar la misma actividad como diálogo y pantalla completa, dinámicamente:

Llame setTheme(android.R.style.Theme_Dialog)antes de llamar setContentView(...)y super.oncreate()en su Actividad.

2 - Si no planea cambiar el estilo del tema de actividad, puede usar

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

(como lo menciona @faisal khan)

M. Usman Khan
fuente
Solo una nota: cuando uso el método programático (el primer método), todo detrás del cuadro de diálogo se oscurece por completo; Sin embargo, esto no fue un problema en el otro método. Lástima ... Tenía muchas ganas de hacerlo mediante programación ... Nexus 5, Android 6.0.1
Eric
@Eric, ¿encontraste una solución para el desmayo?
Anand
1
@ y sí, la combinación de ambas soluciones soluciona el problema del apagón: establezca el tema de la actividad en un tema de diálogo en el manifiesto de Android ( <activity android:theme="@android:style/Theme.Dialog" />) y configure programáticamente el tema de la actividad en un diálogo o una actividad en onCreate stackoverflow.com/a/35915764/2898715
Eric
21

Si necesita la versión de Appcompat

style.xml

    <!-- Base application theme. -->
    <style name="AppDialogTheme" parent="Theme.AppCompat.Light.Dialog">
        <!-- Customize your theme here. -->
        <item name="windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
    </style>

yourmanifest.xml

    <activity
          android:name=".MyActivity"
          android:label="@string/title"
          android:theme="@style/AppDialogTheme">
    </activity>
Neferpitou
fuente
Esto es genial. Necesitaba eliminar la barra de acción. Sin embargo, tuve que modificar el XML un poco. Tuve que agregar <item name="windowNoTitle">true</item>para que funcione para mí. También agregué <item name="android:windowActionBar">false</item>por si acaso.
Eric
55
También para mí <item name="android:windowNoTitle">true</item>no funcionó (Android 5.0.1), y tuve que cambiar a<item name="windowNoTitle">true</item>
noti
17

Si su actividad se representa como un cuadro de diálogo, simplemente agregue un botón al xml de su actividad,

<Button
    android:id="@+id/close_button"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Dismiss" />

Luego, adjunte un detector de clics en el código Java de su Actividad. En el oyente, simplemente llamefinish()

Button close_button = (Button) findViewById(R.id.close_button);
close_button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        finish();
    }
});

Eso debería descartar su diálogo y regresarlo a la actividad de llamada.

aaronsnoswell
fuente
8

Si desea eliminar el encabezado de actividad y proporcionar una vista personalizada para el cuadro de diálogo, agregue lo siguiente al bloque de actividad de su manifiesto

android:theme="@style/Base.Theme.AppCompat.Dialog"

y diseñe su activity_layout con la vista deseada

Ismail Iqbal
fuente
2

Establezca el tema en su archivo de manifiesto de Android.

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

Y configure el estado del diálogo al tacto para finalizar.

this.setFinishOnTouchOutside(false);
Gyan Swaroop Awasthi
fuente
1

Crear actividad como diálogo, aquí hay un ejemplo completo

ingrese la descripción de la imagen aquí

  1. AndroidManife.xml

    <activity android:name=".appview.settings.view.DialogActivity" android:excludeFromRecents="true" android:theme="@style/Theme.AppCompat.Dialog"/>

  2. DialogActivity.kt

    class DialogActivity : AppCompatActivity() {
      override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_dialog)
        this.setFinishOnTouchOutside(true)
    
        btnOk.setOnClickListener {
          finish()
        }
      }
    }
  3. activity_dialog.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#0072ff"
    android:gravity="center"
    android:orientation="vertical">
    
    <LinearLayout
        android:layout_width="@dimen/_300sdp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/txtTitle"
            style="@style/normal16Style"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:paddingTop="20dp"
            android:paddingBottom="20dp"
            android:text="Download"
            android:textColorHint="#FFF" />
    
        <View
            android:id="@+id/viewDivider"
            android:layout_width="match_parent"
            android:layout_height="2dp"
            android:background="#fff"
            android:backgroundTint="@color/white_90"
            app:layout_constraintBottom_toBottomOf="@id/txtTitle" />
    
        <TextView
            style="@style/normal14Style"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:paddingTop="20dp"
            android:paddingBottom="20dp"
            android:text="Your file is download"
            android:textColorHint="#FFF" />
    
    
        <Button
            android:id="@+id/btnOk"
            style="@style/normal12Style"
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:layout_marginBottom="20dp"
            android:background="@drawable/circle_corner_layout"
            android:text="Ok"
            android:textAllCaps="false" />
        </LinearLayout>
    
      </LinearLayout>
Sanjayrajsinh
fuente
No utilice fuentes x-large para que su respuesta se vea rara.
CopsOnRoad
0

Algunas veces puede obtener la excepción que se proporciona a continuación

Causado por: java.lang.IllegalStateException: debe utilizar un tema Theme.AppCompat (o descendiente) con esta actividad.

Entonces, para resolver, puede usar una solución simple

agregue el tema de su actividad en manifiesto como diálogo para appCompact.

android:theme="@style/Theme.AppCompat.Dialog"

Puede ser útil para alguien.

Gyan Swaroop Awasthi
fuente