Comment puis-je faire en sorte qu'une fenêtre d'activité de style Dialogue remplisse l'écran?

142

J'utilise une activité avec l'ensemble de thèmes de dialogue et je souhaite qu'elle soit en plein écran. J'ai essayé toutes sortes de choses, même en passant par WindowManager pour agrandir manuellement la fenêtre en pleine largeur et en hauteur, mais rien ne fonctionne.

Apparemment, une fenêtre de dialogue (ou une activité avec le thème de dialogue) ne se développera qu'en fonction de son contenu, mais même cela ne fonctionne pas toujours. Par exemple, je montre un cercle de barre de progression dont la largeur et la hauteur sont définies sur FILL_PARENT (tout comme son conteneur de disposition), 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, mais est-ce qu'il se déplie en plein écran sans que son contenu ne soit également redimensionné?

Matthias
la source
2
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 se redimensionne en conséquence. Mais lorsque vous le définissez sur FILL_PARENT, alors ce n'est pas le cas ...
Matthias
Vraiment? La mise en page que l'activité instancie, a-t-elle une balise parent Relative ou LinearLayout 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 la prise de tout l'écran.
MattC
Oui, l'activité a un LinearLayout défini sur FILL_PARENT pour la largeur et la hauteur.
Matthias le
J'ai en quelque sorte résolu le problème en utilisant une solution de contournement, mais comme ce n'est pas une bonne solution, je vais laisser la question ouverte. Ce que j'ai fait a été de sous-classer LinearLayout et de remplacer sa méthode onMeasure (), qui est chargée de déterminer la taille de la vue pendant un cycle de mise en page, et de la fixer à la largeur et à la hauteur de l'écran. Ce n'est pas correct cependant, car cela ne prend pas en compte l'espace occupé par les barres de menus, de sorte que le conteneur sera en fait plus grand qu'il n'y paraît à l'écran (avec tous les effets secondaires étranges comme les enfants disparaissant dans les zones non visibles de l'écran).
Matthias
J'ai trouvé la bonne solution, voir ma réponse ci-dessous.
Matthias

Réponses:

312

J'ai trouvé la solution:

Dans votre activité qui a le Theme.Dialogstyle défini, procédez comme suit:

@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 avoir appelé setContentView(), sinon cela ne fonctionnera pas.

Matthias
la source
5
Merci, économisé mon temps, nulle part je n'aurais compris cela! mais une idée pourquoi nous devons spécifier explicitement dans le code, pourquoi fill_parent ne fonctionne pas via xml pour les activités avec le dialogue de thème?
sam
3
Ma boîte de dialogue ne remplira pas la largeur, ni par XML, ni par cette méthode. Je mange mes ongles.
eitama
6
Et c'est:import android.view.ViewGroup.LayoutParams;
11
FILL_PARENT est obsolète maintenant, utilisez MATCH_PARENT à la place
AlexV
4
Il ne remplit pas tout l'écran, c'est comme s'il avait un petit rembourrage de chaque côté.
Machado
66

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>
Serhii Nadolynskyi
la source
2
solution la plus simple. Il fonctionne également avec la bibliothèque de support appcompat. Merci.
Muhammad Saqib
Cela devrait être une réponse acceptée. La manière la plus appropriée et la plus propre de le faire. Pensez à utiliser parent = "@ style / Theme.AppCompat.Light.Dialog"
Kirill Karmazin
Cela semble que cela devrait fonctionner, mais ce n'est pas le cas pour moi. Hmm, je me demande pourquoi. Peut-être que les choses ont changé depuis 2014.
Scott Biggs
53

Je veux juste remplir seulement 80% de l'écran pour cela j'ai fait comme ça 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 mets la ligne getwindow (). setLayout ... sous setContentView (..)

merci @Matthias

Padma Kumar
la source
11

Enveloppez votre dialog_custom_layout.xml dans RelativeLayout au lieu de toute autre mise en page. Cela a fonctionné pour moi.

Ayan
la source
1
Même chose ici, la largeur et la hauteur étaient complètement fausses et ne pouvaient pas comprendre comment réparer. La conversion de la disposition racine en RelativeLayout a également résolu mes problèmes!
SharpMobileCode
8

Pour le dialogue Cela peut être utile pour quelqu'un. Je veux qu'une boîte de dialogue prenne toute la largeur de l'écran. beaucoup cherché mais rien n'a été trouvé utile. Finalement, cela a fonctionné pour moi:

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

après avoir ajouté cela, ma boîte de dialogue apparaît dans toute la largeur de l'écran.

Rahul Sharma
la source
5

Cette réponse est une solution de contournement pour ceux qui utilisent "Theme.AppCompat.Dialog" ou tout autre descendant de "Theme.AppCompat.Dialog" comme "Theme.AppCompat.Light.Dialog", "Theme.AppCompat.DayNight.Dialog", etc. Je dois moi-même utiliser la boîte de dialogue AppCompat car j'utilise AppCompatActivity comme l'étend pour toutes mes activités. Il y aura un problème qui fera que la boîte de dialogue a un remplissage sur tous les côtés (haut, droite, bas et gauche) si nous utilisons la réponse acceptée.

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

    setContentView(R.layout.your_layout);

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

Sur le style de votre activité, ajoutez ce code

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

Comme vous le remarquerez peut-être, le problème qui génère le remplissage de notre boîte de dialogue est "android: windowBackground", donc ici je rends l'arrière-plan de la fenêtre à null.

HendraWD
la source
2

Définissez une largeur minimale pour la mise en page la plus haute.

android:minWidth="300dp"

Par exemple:

<?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>
Roy Matthieu
la source
2

La réponse de Matthias est généralement juste, mais elle ne remplit toujours pas tout l'écran car elle a un petit rembourrage de chaque côté (souligné par @Holmes). En plus de son code, nous pourrions résoudre ce problème en étendant le style Theme.Dialog et en ajoutant des attributs comme celui-ci.

<style name="MyDialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowNoTitle">true</item>
</style>

Ensuite, nous déclarons simplement l'activité avec le thème défini sur MyDialog:

<activity
    android:name=".FooActivity"
    android:theme="@style/MyDialog" />
DYS
la source
1

Ce serait utile pour quelqu'un comme moi. Créer un style de dialogue personnalisé:

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

Dans AndroidManifest.xmlle thème du jeu de fichiers pour l'activité souhaitée:

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

C'est tout, pas besoin d'appeler des méthodes par programmation.

Stanojkovic
la source
afficher toujours le rembourrage de chaque côté (en haut, à droite, en bas et à gauche) et si nous devons également afficher la barre d'état, cette solution échouera
HendraWD
Vérifiez stackoverflow.com/a/39590004/3940133 si vous avez un rembourrage de chaque côté
HendraWD
0

Dans votre fichier manifeste où notre activité est définie

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

sans barre d'action

<activity android:name=".YourPopUpActivity"
            android:theme="@android:style/Theme.Holo.Dialog.NoActionBar"/>
Makvin
la source