Activité Android sous forme de dialogue


257

J'ai une activité nommée whereActityqui a également des dialogues enfants. Maintenant, je veux afficher cette activité comme une boîte de dialogue pour une autre activité.

Comment puis je faire ça?

entrez la description de l'image ici


Si vous voulez juste une boîte de dialogue de chargement, vous pouvez utiliser ProgressDialog
Daksh Agrawal

Réponses:


546

Pour démarrer l'activité en tant que dialogue, je l'ai défini comme ceci dans AndroidManifest.xml:

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

Utilisez cette propriété à l'intérieur de votre activitybalise pour éviter que votre boîte de dialogue n'apparaisse dans la liste des applications récemment utilisées

android:excludeFromRecents="true"

Si vous souhaitez empêcher la destruction de votre boîte de dialogue / activité lorsque l'utilisateur clique en dehors de la boîte de dialogue:

Après setContentView()dans votre Activityutilisation:

this.setFinishOnTouchOutside(false);

Maintenant, lorsque je l'appelle, startActivity()il s'affiche sous forme de boîte de dialogue, avec l'activité précédente affichée lorsque l'utilisateur appuie sur le bouton de retour.

Notez que si vous utilisez ActionBarActivity(ou le thème AppCompat), vous devrez utiliser à la @style/Theme.AppCompat.Dialogplace.


186
Utiliser Android: theme = "@ android: style / Theme.Dialog" est le chemin à parcourir, mais n'oubliez pas d'utiliser excludeFromRecents = true, sinon votre boîte de dialogue apparaîtra dans les applications récemment utilisées (maintenez la touche Accueil).
Emmanuel

7
j'ai des difficultés liées à l'activité en tant que boîte de dialogue .. j'ai fait l'activité en tant que boîte de dialogue mais le problème est que lorsque je clique en dehors de l'activité, elle se ferme automatiquement .. ??? y a-t-il une solution liée à cela .. ??????
Wolverine le

7
@Emmanuel, il doit être android: excludeFromRecents = "true" notez les guillemets doubles
Sandeep

43
Notez que si vous utilisez ActionBarActivity (ou le thème AppCompat), vous devrez utiliser@style/Theme.AppCompat.Dialog
Quentin Klein

8
@Wolverine, Ajouter this.setFinishOnTouchOutside(false);après la setContentView()méthode pour éviter que l'activité ne soit détruite lorsque vous cliquez en dehors de la boîte de dialogue que vous avez créée.
Anggrayudi H

43

Utilisez ce code pour que l'activité de dialogue ne soit pas fermée lorsque l'utilisateur touche en dehors de la boîte de dialogue:

this.setFinishOnTouchOutside(false);

nécessite l'API niveau 11


1
Existe-t-il une solution pour l'API <11?
PK Gupta

@pkgupta, si cela vous convient, vous ne devriez pas vous inquiéter au moins API <15 car il n'y a pas beaucoup de gens qui utilisent ces versions antérieures de toute façon. En fait, en 2017, je pense que 19 ou 20 est le nouveau minSDK.
Neon Warge

28

Vous pouvez définir ce style dans values ​​/ styles.xml pour effectuer un Splash plus ancien:

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

Et utilisez-le AndroidManifest.xml:

   <activity android:name=".SplashActivity"
          android:configChanges="orientation"
          android:screenOrientation="sensor"
          android:theme="@style/Theme.UserDialog">

2
re @drawable/trans: vous devriez pouvoir utiliser @android:color/transparentce qui créerait un ColorDrawableà utiliser comme arrière-plans.
TWiStErRob

1
<item name = "android: windowBackground"> ​​@ null </item> est une autre alternative
TouchBoarder

Le problème est que l'activité remplit tout l'écran mais ne s'affiche pas en superposition de dialogue.
Shajeel Afzal

C'est <item name="windowNoTitle">true</item> (pas "android"). Voyez ici . Je ne suis pas sûr des autres articles.
Gary99

23

1 - Vous pouvez utiliser la même activité que la boîte de dialogue et le plein écran, dynamiquement:

Appelez setTheme(android.R.style.Theme_Dialog)avant d'appeler setContentView(...)et super.oncreate()dans votre activité.

2 - Si vous ne prévoyez pas de changer le style de thème d'activité, vous pouvez utiliser

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

(comme mentionné par @faisal khan)


Juste une note: lorsque j'utilise la méthode programmatique (la première méthode), tout ce qui se trouve derrière la boîte de dialogue est complètement noirci; ce n'était pas un problème dans l'autre méthode cependant. Dommage ... Je voulais vraiment le faire par programmation .... Nexus 5, Android 6.0.1
Eric

@Eric avez-vous trouvé une solution pour le black-out ??
et le

1
@anand yes, la combinaison des deux solutions corrige le problème de blackout: définir le thème de l'activité sur un thème de dialogue dans le manifeste Android ( <activity android:theme="@android:style/Theme.Dialog" />) et définir le thème de l'activité sur une boîte de dialogue ou une activité sur onCreate stackoverflow.com/a/35915764/2898715
Eric

21

Si vous avez besoin de la version compatible avec App

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>

C'est bien. J'avais besoin de supprimer la barre d'action. J'ai cependant dû légèrement modifier le XML. J'ai dû ajouter <item name="windowNoTitle">true</item>pour que ça marche pour moi. J'ai également ajouté <item name="android:windowActionBar">false</item>pour faire bonne mesure.
Eric

5
Aussi pour moi <item name="android:windowNoTitle">true</item>n'a pas fonctionné (Android 5.0.1), et j'ai dû changer pour<item name="windowNoTitle">true</item>
noti

17

Si votre activité est affichée sous forme de boîte de dialogue, ajoutez simplement un bouton au xml de votre activité,

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

Attachez ensuite un écouteur de clics dans le code Java de votre activité. Dans l'auditeur, appelez simplementfinish()

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

Cela devrait fermer votre boîte de dialogue et vous ramener à l'activité d'appel.


8

Si vous souhaitez supprimer l'en-tête d'activité et fournir une vue personnalisée pour la boîte de dialogue, ajoutez ce qui suit au bloc d'activité de votre manifeste

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

et concevez votre activité_layout avec la vue souhaitée


2

Définissez le thème dans votre fichier manifeste Android.

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

Et définissez l'état de la boîte de dialogue au toucher pour terminer.

this.setFinishOnTouchOutside(false);

1

Créer une activité en tant que boîte de dialogue, voici un exemple complet

entrez la description de l'image ici

  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>

Veuillez ne pas utiliser de polices x-large pour rendre votre réponse étrange.
CopsOnRoad

0

Parfois, vous pouvez obtenir l'exception qui est donnée ci-dessous

Causé par: java.lang.IllegalStateException: vous devez utiliser un thème Theme.AppCompat (ou un descendant) avec cette activité.

Donc, pour résoudre, vous pouvez utiliser une solution simple

ajoutez le thème de votre activité dans le manifeste en tant que boîte de dialogue pour appCompact.

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

Cela peut être utile à quelqu'un.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.