345 votes

Comment faire en sorte qu'un dialogue d'alerte occupe 90 % de la taille de l'écran ?

Je peux créer et afficher une boîte de dialogue d'alerte personnalisée sans problème, mais même dans ce cas, j'ai android:layout_width/height="fill_parent" dans le dialogue xml, il n'est aussi grand que son contenu.

Ce que je veux, c'est une boîte de dialogue qui remplit tout l'écran, à l'exception peut-être d'un remplissage de 20 pixels. Ensuite, l'image qui fait partie de la boîte de dialogue s'étirerait automatiquement à la taille totale de la boîte de dialogue avec fill_parent.

372voto

nmr Points 5504

Selon le développeur de la plateforme Android, Dianne Hackborn, dans este les boîtes de dialogue définissent la largeur et la hauteur de la mise en page de leur fenêtre de niveau supérieur comme suit WRAP_CONTENT . Pour que la boîte de dialogue soit plus grande, vous pouvez définir ces paramètres comme suit MATCH_PARENT .

Code démo :

    AlertDialog.Builder adb = new AlertDialog.Builder(this);
    Dialog d = adb.setView(new View(this)).create();
    // (That new View is just there to have something inside the dialog that can grow big enough to cover the whole screen.)

    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
    lp.copyFrom(d.getWindow().getAttributes());
    lp.width = WindowManager.LayoutParams.MATCH_PARENT;
    lp.height = WindowManager.LayoutParams.MATCH_PARENT;
    d.show();
    d.getWindow().setAttributes(lp);

Notez que les attributs sont définis après l'affichage de la boîte de dialogue. Le système est pointilleux sur le moment où ils sont définis. (Je suppose que le moteur de mise en page doit les définir la première fois que le dialogue est affiché, ou quelque chose comme ça).

Il serait préférable de le faire en étendant Theme.Dialog, ce qui éviterait d'avoir à deviner quand appeler setAttributes (bien que cela représente un peu plus de travail pour que la boîte de dialogue adopte automatiquement un thème clair ou foncé approprié, ou le thème Holo de Honeycomb). Cela peut être fait selon http://developer.Android.com/guide/topics/ui/themes.html#SelectATheme )

7 votes

Que je ne comprenne pas la réponse, ou qu'elle ne me convienne pas.

0 votes

Il convient également de noter que cette solution n'est pas spécifique à la taille de l'écran - elle fonctionnera sur des téléphones/tablettes/autres appareils de toutes tailles, alors que la réponse acceptée doit être adaptée à une taille spécifique.

7 votes

Il ne semble pas que les boîtes de dialogue soient larges comme un wrap_content. Les choses deviennent plus étroites et sont coupées. La boîte de dialogue semble être réglée sur une largeur maximale prédéterminée.

224voto

cvarsendan Points 71

Essayez d'intégrer la disposition de votre boîte de dialogue personnalisée dans RelativeLayout au lieu de LinearLayout . Cela a marché pour moi.

5 votes

C'est le cas pour moi aussi. Quelqu'un peut-il en expliquer la raison ?

0 votes

Est-ce la façon dont RelativeLayout est censé fonctionner ou un heureux accident qui pourrait disparaître ?

20 votes

Nous sommes en 2019 et cela fonctionne toujours. A la vôtre ! Cela devrait en effet être la réponse acceptée.

89voto

koma Points 408

Spécifier FILL_PARENT sur la fenêtre de dialogue, comme d'autres l'ont suggéré, n'a pas fonctionné pour moi (sur Android 4.0.4), car cela a juste étiré le fond noir de la boîte de dialogue pour remplir tout l'écran.

Ce qui fonctionne bien, c'est l'utilisation de la valeur d'affichage minimale, mais en la spécifiant dans le code, de sorte que le dialogue occupe 90 % de l'écran.

Donc :

Activity activity = ...;
AlertDialog dialog = ...;

// retrieve display dimensions
Rect displayRectangle = new Rect();
Window window = activity.getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle);

// inflate and adjust layout
LayoutInflater inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.your_dialog_layout, null);
layout.setMinimumWidth((int)(displayRectangle.width() * 0.9f));
layout.setMinimumHeight((int)(displayRectangle.height() * 0.9f));

dialog.setView(layout);

En général, un simple ajustement de la largeur devrait suffire dans la plupart des cas.

1 votes

Cela ne semble pas fonctionner complètement sur les versions 4.0 et supérieures. Il ne remplit pas 90 % de l'écran. Savez-vous pourquoi ? Je fais cela sur un Motorola Xoom avec la version 4.0.

0 votes

@RyanGray Cela fonctionne pour moi sur un Samsung Nexus S avec un OS mis à jour. Sans informations supplémentaires, je suis malheureusement incapable de vous aider.

82voto

jqpubliq Points 7677

Définir android:minWidth y android:minHeight dans votre xml de vue personnalisé. Ces éléments peuvent forcer l'alerte à ne pas se contenter d'envelopper la taille du contenu. L'utilisation d'une vue comme celle-ci devrait suffire :

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:minWidth="300dp" 
  android:minHeight="400dp">
  <ImageView
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:background="@drawable/icon"/>
</LinearLayout>

5 votes

Oui, avec cela, je peux le définir à une taille spécifique, mais je veux que ce soit la taille de l'écran moins une marge de 20 pixels par exemple. Ou largeur = 90 % de la largeur de l'écran.

5 votes

Les pixels indépendants de la densité sont toujours mis à l'échelle de façon à ce que tout écran soit de 320x480dp, donc une vue de 300x460dp serait un remplissage de 20dp dans tous les cas. Alternativement, vous pouvez trouver la taille de l'écran comme ceci : Affichage display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay() ; int width = display.getWidth() ; et définir maxWidth et maxHeight en conséquence.

5 votes

Hmm de la découmentation je comprends le concept de dp. Mais qu'en est-il si le ratio de l'écran est 16:9 ou 4:3 ? Le dp sera-t-il étiré de manière inégale ?

55voto

Elvis Points 330
dialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);

1 votes

Cela a fonctionné pour moi et a été facile à traduire dans MonoDroid qui a fonctionné comme suit (où d est un nouveau Dialog) : d.Window.SetLayout(WindowManagerLayoutParams.FillParent, WindowManagerLayoutParams.FillParent) ;

14 votes

Mais 90% n'est pas la même chose que 100%. FILL_PARENT indique qu'il faut remplir toute la largeur, 100 %, et non 90 %. N'est-ce pas ?

0 votes

@Ted Vous avez raison. Vous pouvez remplacer FILL_PARENT avec une largeur calculée à 90% de la largeur de l'affichage actuel. Mais j'aime cette réponse car elle est plus simple que les autres.

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