226 votes

Comment définir la largeur et la hauteur d'un DialogFragment?

Disons que je spécifie la disposition de mon DialogFragment dans un fichier de mise en page xml nommé my_dialog_fragment.xml et que je spécifie les valeurs layout_width et layout_height de sa vue racine à une valeur fixe (par exemple 100dp). Ensuite, j'inclus cette mise en page dans la méthode onCreateView(...) de mon DialogFragment comme suit :

View view = inflater.inflate(R.layout.my_dialog_fragment, container, false);

Quand mon DialogFragment apparaît, il ne respecte pas les valeurs layout_width et layout_height spécifiées dans son fichier de mise en page xml et se rétrécit ou s'agrandit plutôt en fonction de son contenu. Est-ce que quelqu'un sait si et comment je peux amener mon DialogFragment à respecter les valeurs layout_width et layout_height spécifiées dans son fichier de mise en page xml ? Pour le moment, je dois spécifier à nouveau la largeur et la hauteur du Dialog dans la méthode onResume() de mon DialogFragment comme suit :

getDialog().getWindow().setLayout(width, height);

Le problème avec cela est que je dois me rappeler de faire les modifications futures de la largeur et de la hauteur à deux endroits.

2 votes

Considérez d'accepter la réponse de jpmcosta. Ce n'est pas un hack et cela résout réellement le problème.

201voto

Blix247 Points 256

Si vous convertissez directement à partir des valeurs des ressources:

int width = getResources().getDimensionPixelSize(R.dimen.popup_width);
int height = getResources().getDimensionPixelSize(R.dimen.popup_height);        
getDialog().getWindow().setLayout(width, height);

Ensuite, spécifiez match_parent dans votre mise en page pour la boîte de dialogue:

android:layout_width="match_parent"
android:layout_height="match_parent"

Maintenant, vous n'avez plus qu'à vous soucier d'un seul endroit (c'est-à-dire votre méthode DialogFragment.onResume). Ce n'est pas parfait, mais au moins cela fonctionne pour avoir un RelativeLayout comme racine du fichier de mise en page de votre boîte de dialogue.

3 votes

Cette réponse ne fonctionne pas dans mon cas (pour DialogFragment). J'ai dû utiliser les paramètres FragmentLayout pour changer la taille de la fenêtre affichée.

3 votes

J'ai dû envelopper mon agencement dans RelativeLayout et cela m'a aidé. Merci beaucoup pour la solution - cela m'a beaucoup fait gagner du temps.

69 votes

Cela fonctionne très bien pour moi (Android 4.0+), une fois que j'ai réalisé que cela doit être dans onResume(), pas dans onCreateView(). (Mon layout racine est un RelativeLayout enveloppé dans un ScrollView.)

182voto

jmaculate Points 146

J'ai fini par remplacer la méthode Fragment.onResume() et récupérer les attributs de la boîte de dialogue sous-jacente, puis définir les paramètres de largeur/hauteur là-bas. J'ai défini la hauteur/largeur du layout le plus externe sur match_parent. Notez que ce code semble respecter les marges que j'ai définies dans la mise en page xml également.

@Override
public void onResume() {
    super.onResume();
    ViewGroup.LayoutParams params = getDialog().getWindow().getAttributes();
    params.width = LayoutParams.MATCH_PARENT;
    params.height = LayoutParams.MATCH_PARENT;
    getDialog().getWindow().setAttributes((android.view.WindowManager.LayoutParams) params);
}

2 votes

Merci ! Ça fonctionne pour moi ! De plus, c'est une façon élégante de le faire.

1 votes

@jmaculate - Question rapide : lorsque vous effectuez une conversion en (android.view.WindowManager.LayoutParams), à partir de quoi effectuez-vous la conversion ? J'étais perplexe en choisissant l'importation correcte pour LayoutParams apparaissant dans les trois premières lignes de la fonction. J'ai fini par choisir (android.view.WindowManager.LayoutParams). Est-ce que c'est censé être correct ?

0 votes

@Dev-iL getAttributes() renvoie un WindowManager.LayoutParams, mais dans mon cas je le caste implicitement en ViewGroup.LayoutParams car c'est tout ce dont j'ai besoin (Effective Java, Article 52) -- Je vais éditer la question pour refléter cela

112voto

Jose_GD Points 876

J'ai un DialogFragment de taille fixe définissant ce qui suit dans la disposition principale XML (LinearLayout dans mon cas) :

android:layout_width="match_parent"
android:layout_height="match_parent"
android:minWidth="1000dp"
android:minHeight="450dp"

4 votes

J'ai trouvé que j'avais besoin de midWidth et minHeight dans Honeycomb - mais pas dans ICS.

2 votes

Il semble fonctionner à première vue mais il devrait probablement être évité. La vue se poursuivra hors de l'écran en fonction de la largeur de l'appareil, donc si vous avez des boutons dans le coin inférieur droit, ils ne s'afficheront pas.

1 votes

La vue NE continue PAS hors de l'écran. Le système Android semble s'assurer que le DialogFragment reste à l'intérieur des limites de la vue (avec une petite marge), même si ces limites sont plus petites que la largeur et la hauteur minimales spécifiées.

52voto

Rodrigo Points 131

La seule chose qui a fonctionné dans mon cas a été la solution indiquée ici : http://adilatwork.blogspot.mx/2012/11/android-dialogfragment-dialog-sizing.html

Extrait du message de blog d'Adil :

@Override
public void onStart()
{
  super.onStart();

  // vérification de sécurité
  if (getDialog() == null)
    return;

  int dialogWidth = ... // spécifiez une valeur ici
  int dialogHeight = ... // spécifiez une valeur ici

  getDialog().getWindow().setLayout(dialogWidth, dialogHeight);

  // ... autres choses que vous voulez faire dans votre méthode onStart()
}

1 votes

Solution parfaite et très bien expliquée dans le blog.

0 votes

+1 getDialog().getWindow().setLayout(dialogWidth, dialogHeight); fonctionne parfaitement pour un DialogFragment. Mais je ne comprends pas la vérification de sécurité. Pourquoi devons-nous vérifier null?

3 votes

@2943 - simplement parce qu'il n'y a aucune garantie que le Dialog (un enfant du DialogFragment) sera disponible au moment où il est demandé. Il est possible qu'Android renvoie null lorsque nous appelons getDialog().

5voto

Systweaker Points 11

J'ai réparé en définissant les paramètres de mise en page de l'élément racine.

int width = activity.getResources().getDisplayMetrics().widthPixels;
int height = activity.getResources().getDisplayMetrics().heightPixels;
content.setLayoutParams(new LinearLayout.LayoutParams(width, height));

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