DialogFragment plein écran dans Android

J’essaie d’afficher un DialogFragment presque plein écran. Mais je ne suis pas en mesure de le faire.

La façon dont je montre le fragment provient directement de la documentation du développeur Android

FragmentManager f = ((Activity)getContext()).getFragmentManager(); FragmentTransaction ft = f.beginTransaction(); Fragment prev = f.findFragmentByTag("dialog"); if (prev != null) { ft.remove(prev); } ft.addToBackStack(null); // Create and show the dialog. DialogFragment newFragment = new DetailsDialogFragment(); newFragment.show(ft, "dialog"); 

Je sais naïvement essayé de définir le RelativeLayout dans le fragment à fill_parent et certains minWidth et minHeight.

  

Je sais que le DialogFragment remplira la majorité de l’écran. Mais je semble seulement redimensionner verticalement mais seulement jusqu’à une largeur fixe horizontalement.

J’ai également essayé de définir les atsortingbuts de fenêtre dans le code, comme suggéré ici: http://groups.google.com/group/android-developers/browse_thread/thread/f0bb813f643604ec . Mais cela n’a pas aidé non plus.

Je ne comprends probablement pas comment Android gère les dialogs, car je suis tout nouveau. Comment puis-je faire quelque chose comme ça? Existe-t-il d’autres moyens d’atteindre mon objective?


Appareil Android:
Asus EeePad Transformer
Android 3.0.1


Mise à jour: j’ai maintenant réussi à le mettre en plein écran, avec le code suivant dans le fragment

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(STYLE_NO_FRAME, android.R.style.Theme_Holo_Light); } 

Malheureusement, ce n’est pas tout à fait ce que je veux. J’ai absolument besoin d’un petit “padding” autour de la boîte de dialog pour afficher le fond.

Des idées sur comment accomplir cela?

Essayez de passer à LinearLayout au lieu de RelativeLayout . Je visais l’API 3.0 Honeycomb lors des tests.

 public class FragmentDialog extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button button = (Button) findViewById(R.id.show); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { showDialog(); } }); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } void showDialog() { FragmentTransaction ft = getFragmentManager().beginTransaction(); DialogFragment newFragment = MyDialogFragment.newInstance(); newFragment.show(ft, "dialog"); } public static class MyDialogFragment extends DialogFragment { static MyDialogFragment newInstance() { MyDialogFragment f = new MyDialogFragment(); return f; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_dialog, container, false); return v; } } } 

et les mises en page : fragment_dialog.xml

    

main.xml

     

Pour obtenir DialogFragment en plein écran

Remplacez onStart de votre DialogFragment comme ceci:

 @Override public void onStart() { super.onStart(); Dialog dialog = getDialog(); if (dialog != null) { int width = ViewGroup.LayoutParams.MATCH_PARENT; int height = ViewGroup.LayoutParams.MATCH_PARENT; dialog.getWindow().setLayout(width, height); } } 

Et merci beaucoup à ce post: Les fragments-mystère-des-androïdes-plein-écran-dialog

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen); } 

Selon ce lien, DialogFragment plein écran affiche le remplissage sur les côtés, cela fonctionnera comme un charme.

 @Override public Dialog onCreateDialog(final Bundle savedInstanceState) { // the content final RelativeLayout root = new RelativeLayout(getActivity()); root.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); // creating the fullscreen dialog final Dialog dialog = new Dialog(getActivity()); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(root); dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); return dialog; } 

J’ai rencontré le problème avant d’utiliser un dialogFragment en plein écran: il y a toujours un remplissage en ayant plein écran. essayez ce code dans la méthode onActivityCreated () de dialogFragment:

 public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Window window = getDialog().getWindow(); LayoutParams atsortingbutes = window.getAtsortingbutes(); //must setBackgroundDrawable(TRANSPARENT) in onActivityCreated() window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); if (needFullScreen) { window.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); } } 

Dans mon cas, j’ai utilisé l’approche suivante:

  @Override public void onStart() { super.onStart(); getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); } } 

Plus LinearLayout pour remplir tout l’espace avec du contenu.

Mais il y avait encore de petits espaces entre les bords gauche et droit de la boîte de dialog et les bords de l’écran sur certains appareils Lollipop + (par exemple, Nexus 9).

Ce n’était pas évident, mais finalement j’ai compris que pour que la largeur de tous les périphériques et plates-formes de la fenêtre en arrière-plan soit spécifiée dans styles.xml, procédez comme suit:

  

Et bien sûr, ce style doit être utilisé lorsque nous créons la boîte de dialog comme suit:

  public static DialogFragment createNoTitleDlg() { DialogFragment frag = new Some_Dialog_Frag(); frag.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Dialog_NoTitle); return frag; } 

Dans la mesure où l’API Android a été mise à jour, la méthode suggérée pour afficher un dialog en plein écran est la suivante:

 FragmentTransaction transaction = this.mFragmentManager.beginTransaction(); // For a little polish, specify a transition animation transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); // To make it fullscreen, use the 'content' root view as the container // for the fragment, which is always the root view for the activity transaction.add(android.R.id.content, this.mFragmentToShow).commit(); 

sinon, si vous ne voulez pas qu’il soit affiché en plein écran, vous pouvez faire comme suit:

 this.mFragmentToShow.show(this.mFragmentManager, LOGTAG); 

J’espère que cela aide.

MODIFIER

Sachez que la solution que j’ai donnée fonctionne, mais a une faiblesse qui peut parfois être gênante. L’ajout du DialogFragment au conteneur android.R.id.content ne vous permettra pas de gérer DialogFragment#setCancelable() la fonctionnalité DialogFragment#setCancelable() et pourrait également entraîner des comportements inattendus lors de l’ajout du DialogFragment à la stack arrière.

Donc, je vous ai suggéré de changer simplement le style de votre DialogFragment dans la méthode onCreate comme suit:

 @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Translucent_NoTitleBar); } 

J’espère que cela aide.

Essayez d’utiliser setStyle () dans onCreate et remplacez onCreateDialog make dialog sans titre

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = super.onCreateDialog(savedInstanceState); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); return dialog; } 

ou simplement remplacer le code onCreate () et setStyle fellow.

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme); } 

Cela peut en effet dépendre de la façon dont la mise en page est définie. Mais pour que la boîte de dialog obtienne la taille requirejse, la meilleure solution consiste à fournir les LayoutParams une fois que la boîte de dialog est affichée (et non lors de la création). Sur un DialogFragment, la boîte de dialog est affichée sur la méthode onStart . Par conséquent, une méthode valide pour obtenir la largeur maximale est:

 @Override public void onStart() { super.onStart(); Dialog d = getDialog(); if (d!=null){ d.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); } } 

Pour fournir également un thème ou un style, comme un style NO_TITLE, le meilleur emplacement est la méthode onCreate :

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_Light_Dialog); } 

Créer un DialogFragment en plein écran en utilisant uniquement le style

Première option

1. Ajoutez à votre style.xml :

   

2. Ajoutez à votre DialogFragment:

 @Override public int getTheme() { return R.style.FullScreenDialog; } 

Deuxième option

 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setStyle(DialogFragment.STYLE_NO_FRAME, R.style.AppTheme) } 

AppTheme est le thème que vous avez défini dans les styles.

c’est la solution comment j’ai compris ce problème

 @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = super.onCreateDialog(savedInstanceState); dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); return dialog; } @Override public void onStart() { super.onStart(); Dialog dialog = getDialog(); if (dialog != null) { dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); } } 

Au cas où quelqu’un d’autre le rencontrerait, j’ai vécu une expérience similaire, mais le problème était que j’avais oublié de retourner la vue gonflée à partir de onCreateView (au lieu de retourner le super.onCreateView par défaut). J’ai simplement retourné la vue gonflée correcte et cela a résolu le problème.

Chirag Nagariya a raison sauf l’addition ‘_Fullscreen’. il peut être résolu en utilisant n’importe quel style de base qui ne dérive pas du style Dialog. Vous pouvez également utiliser android.R.style.Theme_Black_NoTitleBar.

 @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = new Dialog(getActivity(), android.R.style.Theme_Holo_Light); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); return dialog; } 

Cette solution applique un thème plein écran sur la boîte de dialog, similaire au setStyle de Chirag dans onCreate. Un inconvénient est que savedInstanceState n’est pas utilisé.

Essayez ceci pour la boîte de dialog des fragments communs pour des utilisations multiples. J’espère que cela vous aidera à mieux

 public class DialogFragment extends DialogFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_visit_history_main, container, false); getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); initializeUI(rootView); return rootView; } @Override public void onStart() { super.onStart(); Dialog dialog = getDialog(); if (dialog != null) { int width = ViewGroup.LayoutParams.MATCH_PARENT; int height = ViewGroup.LayoutParams.MATCH_PARENT; dialog.getWindow().setLayout(width, height); } } private void initializeUI(View rootView) { //getChildFragmentManager().beginTransaction().replace(R.id.fv_container,FragmentVisitHistory.getInstance(), AppConstant.FRAGMENT_VISIT_HISTORY).commit(); } } 

Voici ce que vous devez définir pour fragmenter:

 /* theme is optional, I am using leanback... */ setStyle(STYLE_NORMAL, R.style.AppTheme_Leanback); 

Dans ton cas:

 DialogFragment newFragment = new DetailsDialogFragment(); newFragment.setStyle(STYLE_NORMAL, R.style.AppTheme_Leanback); newFragment.show(ft, "dialog"); 

Et pourquoi? Parce que DialogFragment (s’il n’est pas dit explicitement), utilisera ses styles internes pour y insérer votre présentation personnalisée (pas de plein écran, etc.).

Et la mise en page? Aucun moyen de piratage nécessaire, cela fonctionne très bien:

   ...  

Prendre plaisir

Je suis très en retard pour répondre à cette question, mais je veux partager cette réponse afin que tout le monde puisse l’utiliser à l’avenir.

J’ai utilisé ce code dans mon projet il fonctionne dans la version inférieure ainsi que la version supérieure.

Utilisez simplement ce thème dans onCreateDialog () comme ceci:

 @Override public Dialog onCreateDialog(Bundle savedInstanceState) { View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_pump_details, null); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), android.R.style.Theme_Black_NoTitleBar_Fullscreen); return builder.create(); } 

android.R.style.Theme_Black_NoTitleBar_Fullscreen – Voici le code source de ce thème, vous pouvez voir que ce thème est suffisant pour faire apparaître DialogFragment en plein écran.

   

S’il vous plaît laissez-moi savoir si quelqu’un est confronté à un problème. J’espère que c’est utile. Merci 🙂

La méthode suivante fonctionnera même si vous travaillez sur une mise en page relative. Suivez les étapes suivantes:

  1. Aller à l’éditeur de thème (Disponible sous Outils-> Android -> Editeur de thème)
  2. Sélectionnez Afficher tous les thèmes. Sélectionnez celui avec AppCompat.Dialog
  3. Choisissez l’option Arrière-plan de la fenêtre Android si vous voulez qu’elle soit de couleur quelconque ou transparente.
  4. Sélectionnez la couleur et appuyez sur OK. Sélectionnez un nom pour le nouveau thème.
  5. Allez dans styles.xml , puis sous le thème que vous venez d’append, ajoutez ces deux atsortingbuts:

     true false 

Mon paramètre de thème pour la boîte de dialog est le suivant:

  

Assurez-vous que le thème a un parent en tant que Theme.AppCompat.Dialog Une autre façon serait de créer un nouveau style dans styles.xml et de le modifier selon le code ci-dessus.

  1. Accédez à votre classe Dialag Fragment et, dans la méthode onCreate () , définissez le style de votre boîte de dialog comme suit :

    @Override public void onCreate (@Nullable Bundle savedInstanceState) {super.onCreate (savedInstanceState); setStyle (DialogFragment.STYLE_NORMAL, R.style.DialogTheme); }

Créez le thème ci-dessous dans votre style.xml:

  

puis définissez le style dans DialogFragment

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogTheme); } 

window.setLayout n’est pas suffisant pour les anciens appareils.

Voici ce que je fais:

 try { ViewGroup parent = (ViewGroup) view; do { parent = (ViewGroup) parent.getParent(); if (parent == null) break; parent.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT; parent.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; parent.requestLayout(); } while (true); } catch (Exception e){} 

Même on peut trouver la bonne réponse ici. Mais je veux clarifier une confusion.

Utiliser android.app.DialogFragment

 @Override public void onStart() { super.onStart(); Dialog dialog = getDialog(); if (dialog != null) { int width = ViewGroup.LayoutParams.MATCH_PARENT; int height = ViewGroup.LayoutParams.MATCH_PARENT; dialog.getWindow().setLayout(width, height); } } 

Utiliser android.support.v4.app.DialogFragment

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen); }