145 votes

Comment faire en sorte qu'une fenêtre d'activité de type Dialog remplisse l'écran ?

J'utilise une activité avec le thème du dialogue, et je veux qu'elle soit en plein écran. J'ai essayé toutes sortes de choses, même de passer par le WindowManager pour étendre la fenêtre en largeur et en hauteur manuellement, mais rien ne fonctionne.

Apparemment, une fenêtre de dialogue (ou une activité ayant pour thème le dialogue) ne se développe qu'en fonction de son contenu, mais même cela ne fonctionne pas toujours. Par exemple, j'affiche une barre de progression circulaire dont la largeur et la hauteur sont définies sur FILL_PARENT (tout comme son conteneur de mise en page), mais la boîte de dialogue s'enroule autour de la barre de progression beaucoup plus petite au lieu de remplir l'écran.

Il doit y avoir un moyen d'afficher quelque chose de petit à l'intérieur d'une fenêtre de dialogue et de l'étendre en plein écran sans que son contenu soit également redimensionné ?

2 votes

Remarque intéressante : lorsque vous définissez la largeur et la hauteur du conteneur de mise en page sur une valeur réelle en pixels, la boîte de dialogue est redimensionnée en conséquence. Mais lorsqu'on lui attribue la valeur FILL_PARENT, elle ne le fait pas...

0 votes

Vraiment ? La disposition que l'activité instancie, a-t-elle une balise parent Relative ou LinearLayout qui est définie sur la hauteur et la largeur de fill_parent ? J'ai implémenté quelques activités avec un thème de dialogue et je n'ai jamais eu de problème avec l'occupation de tout l'écran.

0 votes

Oui, l'activité a un LinearLayout réglé sur FILL_PARENT pour la largeur et la hauteur.

327voto

Matthias Points 17181

J'ai trouvé la solution :

Dans votre activité qui a le Theme.Dialog le style défini, faites ceci :

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

    setContentView(R.layout.your_layout);

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

Il est important que vous appeliez Window.setLayout() après vous appelez setContentView() sinon cela ne fonctionnera pas.

5 votes

Merci, cela m'a fait gagner du temps, je n'aurais jamais pu trouver cette solution ! Mais pourquoi devons-nous spécifier explicitement dans le code, pourquoi fill_parent ne fonctionne pas via xml pour les activités avec le dialogue de thème ?

3 votes

Mon dialogue ne se remplit pas en largeur, ni par XML, ni par cette méthode. Je me ronge les ongles.

6 votes

Et c'est le cas : import android.view.ViewGroup.LayoutParams;

73voto

Serhii Nadolynskyi Points 4725

Vous pouvez ajouter ces valeurs à votre style Android:windowMinWidthMajor et Android:windowMinWidthMinor.

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

3 votes

La solution la plus simple. Il fonctionne également avec la bibliothèque de support d'appcompat. Merci.

0 votes

Cette réponse devrait être acceptée. C'est la façon la plus correcte et la plus propre de procéder. Pensez à utiliser parent="@style/Theme.AppCompat.Light.Dialog"

0 votes

Cela semble devoir fonctionner, mais ce n'est pas le cas pour moi. Hmm, je me demande pourquoi. Peut-être que les choses ont changé depuis 2014.

54voto

Padma Kumar Points 10698

Je veux juste remplir seulement 80% de l'écran pour cela j'ai fait comme ceci ci-dessous

        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

cela ne fonctionne que lorsque je place la ligne getwindow().setLayout... sous la ligne setContentView(..)

Merci @Matthias

13voto

Ayan Points 1480

Enveloppez votre dialogue_custom_layout.xml en RelativeLayout au lieu d'une autre disposition. Cela a fonctionné pour moi.

1 votes

Même chose ici, la largeur et la hauteur étaient complètement fausses et je n'ai pas pu trouver comment les réparer. La conversion de la disposition Root en RelativeLayout a également réglé mes problèmes !

9voto

Rahul Sharma Points 3411

Pour le dialogue Cela peut être utile à quelqu'un. Je veux qu'un dialogue prenne toute la largeur de l'écran. J'ai beaucoup cherché mais je n'ai rien trouvé d'utile. Finalement, ceci a fonctionné pour moi :

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

après avoir ajouté ceci, mon dialogue apparaît dans toute la largeur de l'écran.

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