web-dev-qa-db-fra.com

Full Screen DialogFragment in Android

J'essaie de montrer un DialogFragment presque plein écran. Mais je ne suis pas en mesure de le faire.

La façon dont je présente le fragment provient directement de la documentation pour les développeurs 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 que j'ai naïvement essayé de définir le paramètre RelativeLayout dans le fragment sur fill_parent et sur certains paramètres minWidth et minHeight.

<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"  
    Android:minWidth="1000px" 
    Android:minHeight="600px"
    Android:background="#ff0000">

Je sais que le DialogFragment devrait occuper la majeure partie de l’écran. Mais je ne semble que redimensionner verticalement, mais seulement jusqu'à ce que certaines largeur fixe horizontalement.

J'ai également essayé de définir les attributs de la 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 comprends probablement mal comment Android gère les dialogues, car je suis tout nouveau. Comment puis-je faire quelque chose comme ça? Existe-t-il d'autres moyens d'atteindre mon objectif?


Appareil Android:
Asus EeePad Transformer
Android 3.0.1


Update: Je suis maintenant parvenu à l'obtenir 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 certainement besoin d'un petit "remplissage" autour de la boîte de dialogue pour afficher l'arrière-plan.

Des idées comment accomplir cela?

126
Eric

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 layouts : fragment_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android" 
    Android:layout_width="match_parent" 
    Android:layout_height="match_parent" 
    Android:minWidth="1000dp"  
    Android:minHeight="1000dp"> 
 </LinearLayout> 

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical" 
    Android:layout_width="match_parent" 
    Android:layout_height="match_parent"
    Android:background="#ffffff">
    <Button Android:id="@+id/show"
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content"
        Android:layout_weight="0"
        Android:text="show">
    </Button>
</LinearLayout>
70
bradley4

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 à cet article: Le-mystère-des-androïdes-fragments-de-dialogues-plein-écran

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

    setStyle(DialogFragment.STYLE_NORMAL,
             Android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}
116
Chirag Nagariya

Selon ce lien DialogFragment en plein écran montre 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;
}
34
Ayman Mahgoub

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 écarts entre les bords gauche et droit de la boîte de dialogue et les bords de l’écran de certains périphériques Lollipop + (par exemple, Nexus 9).

Ce n’était pas évident, mais j’ai finalement compris que pour le rendre sur toute la largeur sur tous les appareils et plates-formes le fond de la fenêtre devrait être spécifié dans styles.xml comme suit:

<style name="Dialog.NoTitle" parent="Theme.AppCompat.Dialog">
    <item name="Android:windowNoTitle">true</item>
    <item name="Android:padding">0dp</item>
    <item name="Android:windowBackground">@color/window_bg</item>
</style>

Et bien sûr, ce style doit être utilisé lors de la création du dialogue, comme suit:

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

Je rencontrais le problème auparavant lorsque j'utilisais un dialogFragment en plein écran: il y avait toujours un bourrage lors de la définition en 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 attributes = window.getAttributes();
    //must setBackgroundDrawable(TRANSPARENT) in onActivityCreated()
    window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    if (needFullScreen)
    {
        window.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    }
}
15
ruidge

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

Première solution

1. Ajouter à votre style.xml:

    <style name="FullScreenDialog" parent="Theme.AppCompat.Light.Dialog">
        <item name="Android:backgroundDimEnabled">false</item>
        <item name="Android:windowNoTitle">true</item>
        <item name="Android:padding">0dp</item>
        <item name="Android:windowIsFloating">false</item>
        <item name="Android:windowBackground">@Android:color/transparent</item>
    </style>

2. Ajoutez à votre DialogFragment:

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

Solution alternative

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.

11
vovahost

Dans la mesure où l'API Android a été mise à jour, la méthode suggérée pour afficher une boîte de dialogue 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 souhaitez pas qu'il s'affiche en plein écran, procédez comme suit:

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

J'espère que ça aide.

MODIFIER

Sachez que la solution que j'ai donnée fonctionne mais présente une faiblesse qui peut parfois être gênante. L'ajout de DialogFragment au conteneur Android.R.id.content ne vous permettra pas de gérer correctement la fonctionnalité DialogFragment#setCancelable() et pourrait entraîner des comportements inattendus lors de l'ajout de DialogFragment lui-même à la pile arrière. 

Je vous ai donc suggéré de modifier 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 ça aide.

10
andrea.rinaldi

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 substituez simplement onCreate () et setStyle le code.

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

Cela peut en effet dépendre de la définition de la mise en page. Mais pour que la boîte de dialogue atteigne la taille requise, la meilleure solution consiste à fournir les LayoutParams une fois la boîte de dialogue affichée (et non lors de la création). Sur un DialogFragment, la boîte de dialogue est affichée à l'aide de la méthode onStart. Une méthode valide pour obtenir la largeur totale est donc:

@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);
}
8
coderazzi

Voici comment j'ai résolu 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));
    }
}
3
savepopulation

Et la version kotlin!

override fun onStart() {
    super.onStart()
    dialog?.let {
        val width = ViewGroup.LayoutParams.MATCH_PARENT
        val height = ViewGroup.LayoutParams.MATCH_PARENT
        it.window?.setLayout(width, height)
    }
}
1
Boldijar Paul

Essayez ceci avec une boîte de dialogue de fragment commune pour plusieurs utilisations . J'espère que cela vous aidera à mieux jouer

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();
    }
}
1
Dashrath Rathod

Je suis très en retard pour répondre à cette question et je souhaite néanmoins 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 dans 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.

<!-- Variant of {@link #Theme_Black} that has no title bar and
     no status bar.  This theme
     sets {@link Android.R.attr#windowFullscreen} to true.  -->
<style name="Theme.Black.NoTitleBar.Fullscreen">
    <item name="windowFullscreen">true</item>
    <item name="windowContentOverlay">@null</item>
</style>

S'il vous plaît laissez-moi savoir si quelqu'un est confronté à un problème . J'espère que cela est utile. Merci :) 

1
Biswajit

Au cas où quelqu'un d'autre l'aurait rencontré, j'ai vécu une expérience similaire, mais il s'est avéré que le problème était que j'avais oublié de renvoyer la vue gonflée depuis onCreateView (à la place, elle renvoie la valeur par défaut super.onCreateView). J'ai simplement retourné la vue gonflée correcte et cela a résolu le problème.

1
user1205577
@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 dans la boîte de dialogue, similaire au setStyle de Chirag dans onCreate. Un inconvénient est que savedInstanceState n'est pas utilisé.

1
Xingang Huang

Chirag Nagariya a raison sauf l'ajout de '_Fullscreen'. il peut être résolu en utilisant n'importe quel style de base qui ne soit pas dérivé du style Dialog. 'Android.R.style.Theme_Black_NoTitleBar' peut également être utilisé.

1
Shoham Ben-Har

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 (quand cela n’est pas dit explicitement), utilisera ses styles internes qui encapsuleront votre mise en page personnalisée (pas d’écran plein écran, etc.).

Et la mise en page? Aucune façon hacky nécessaire, cela fonctionne très bien:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent">
    ...
</RelativeLayout>

Prendre plaisir

1
arenaq

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

<style name="DialogTheme" parent="Theme.AppCompat.Light.DarkActionBar">
   <item name="Android:paddingRight">0dp</item>
   <item name="Android:paddingLeft">0dp</item>
   <item name="Android:layout_width">match_parent</item>
   <item name="Android:windowNoTitle">true</item>
</style>

puis définissez le style dans DialogFragment

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

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

  1. Aller à l'éditeur de thèmes (Disponible sous Outils-> Android -> Editeur de thèmes)
  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 que ce soit avec un arrière-plan coloré ou transparent.
  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'ajouter, Ajoutez ces deux attributs:

    <item name="Android:windowNoTitle">true</item>
    <item name="Android:windowIsFloating">false</item>
    

Mon thème de dialogue est le suivant:

<style name="DialogTheme" parent="Theme.AppCompat.Dialog" >
    <item name="Android:layout_width">match_parent</item>
    <item name="Android:layout_height">match_parent</item>
    <item name="Android:windowBackground">@Android:color/transparent</item>
    <item name="Android:windowNoTitle">true</item>
    <item name="Android:windowIsFloating">false</item>

Assurez-vous que le thème a un parent comme Theme.AppCompat.Dialog Vous pouvez également créer un nouveau style dans styles.xml et le modifier comme indiqué dans le code ci-dessus.

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

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

1
Saumya Mehta

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);
}
0
Khemraj

Ajoutez ces lignes ci-dessous dans le style de la boîte de dialogue plein écran.

<item name="Android:windowNoTitle">true</item>
    <item name="Android:windowFullscreen">true</item>
    <item name="Android:windowIsFloating">false</item>
0
MEGHA DOBARIYA

Une solution utilisant la nouvelle ConstraintLayout englobe la ConstraintLayout dans une LinearLayout avec minHeight et minWidth corrigés. Sans le wrapping, ConstraintLayout n'obtient pas la bonne taille pour le dialogue.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:minWidth="1000dp"
    Android:minHeight="1000dp"
    Android:orientation="vertical">

    <androidx.constraintlayout.widget.ConstraintLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:background="@color/background_color"
        Android:orientation="vertical">
        <!-- some constrained views -->
    </androidx.constraintlayout.widget.ConstraintLayout>

</LinearLayout>
0
Nicola Gallazzi
This below answer works for me in fragment dialog.  


  Dialog dialog = getDialog();
        if (dialog != null)
        {
            int width = ViewGroup.LayoutParams.MATCH_PARENT;
            int height = ViewGroup.LayoutParams.MATCH_PARENT;
            dialog.getWindow().setLayout(width, height);
        }
0
MEGHA DOBARIYA

window.setLayout n'est pas suffisant pour les appareils plus anciens.

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){}
0
palindrom