272 votes

Activité Android en tant que dialogue

J'ai une activité nommée whereActity qui possède également des boîtes de dialogue enfant. Maintenant, je veux afficher cette activité comme un dialogue pour une autre activité.

Comment puis-je faire ça ?

enter image description here

0 votes

Si vous voulez juste le dialogue de chargement, vous pouvez utiliser ProgressDialog

565voto

Faisal khan Points 12697

Pour lancer l'activité en tant que dialogue, je l'ai définie comme suit dans le fichier AndroidManifest.xml :

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

Utilisez cette propriété dans votre activity pour éviter que votre boîte de dialogue n'apparaisse dans la liste des applications récemment utilisées.

android:excludeFromRecents="true"

Si vous voulez empêcher que votre dialogue/activité soit détruit lorsque l'utilisateur clique en dehors du dialogue :

Après setContentView() dans votre Activity utiliser :

this.setFinishOnTouchOutside(false);

Maintenant, quand j'appelle startActivity() il s'affiche sous forme de dialogue, l'activité précédente étant affichée lorsque l'utilisateur appuie sur le bouton retour.

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

188 votes

L'utilisation de la balise Android:theme="@Android:style/Theme.Dialog" est la meilleure solution, 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 Home enfoncée).

3 votes

J'ai également eu des difficultés avec la taille de la boîte de dialogue si j'utilise LinearLayout comme disposition racine. L'utilisation de RelativeLayout est utile si vous devez définir requestWindowFeature(Window.FEATURE_NO_TITLE) ou getWindow().setFeatureDrawableResource(Window.FEATURE_NO_TITLE, Android.R.drawable.ic_dialog_alert).

7 votes

J'ai des difficultés avec l'activité en tant que dialogue. j'ai fait l'activité en tant que 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 à ce problème ? ?????

45voto

Maverick Points 176

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

requiert le niveau 11 de l'API

1 votes

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

0 votes

@pkgupta, si c'est acceptable pour vous, vous ne devriez pas vous inquiéter au moins API <15 pour moi puisqu'il n'y a pas beaucoup de gens qui utilisent ces versions antérieures de toute façon. En fait, à partir de 2017, je pense que 19 ou 20 est le nouveau minSDK.

31voto

herbertD Points 1721

Vous pouvez définir ce style dans values/styles.xml pour réaliser 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 l'utiliser AndroidManifest.xml :

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

2 votes

Concernant @drawable/trans : vous devriez être en mesure d'utiliser @android:color/transparent ce qui créerait un ColorDrawable à utiliser comme arrière-plan.

1 votes

<item name="Android:windowBackground">@null</item> est une autre alternative

0 votes

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

23voto

usman Points 546

1 - Vous pouvez utiliser la même activité à la fois en dialogue et en plein écran, de manière dynamique :

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

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

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

(comme mentionné par @faisal khan)

0 votes

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 de manière programmatique....Nexus 5, Android 6.0.1

0 votes

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

1 votes

@anand oui, en combinant les deux solutions, le problème de blackout est résolu : définir le thème de l'activité à un thème de dialogue dans le manifeste Android ( <activity android:theme="@android:style/Theme.Dialog" /> ) et définir par programme le thème de l'activité pour un dialogue ou une activité dans onCreate stackoverflow.com/a/35915764/2898715

17voto

aaronsnoswell Points 2205

Si votre activité est rendue sous forme de dialogue, il suffit d'ajouter un bouton au fichier 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 clic dans le code Java de votre activité. Dans l'écouteur, appelez simplement finish()

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

La boîte de dialogue devrait s'interrompre et vous ramener à l'activité d'appel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X