184 votes

DialogFragment plein écran dans Android

J'essaie d'afficher un DialogFragment presque en plein écran. Mais je ne parviens pas à le faire.

La façon dont je montre le fragment est directement issue de la documentation pour les développeurs d'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");

J'ai naïvement essayé de définir le RelativeLayout dans le fragment à fill_parent et quelques 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 ne m'attendrais pas à ce que le DialogFragment remplisse la majeure partie de l'écran. Mais il semble que je ne puisse redimensionner que verticalement, mais seulement jusqu'à une certaine 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 ne comprends probablement pas bien la façon dont Android gère les boîtes de dialogue, car je suis tout à fait novice en la matière. 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


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 vraiment besoin d'un petit "rembourrage" autour de la boîte de dialogue pour montrer l'arrière-plan.

Une idée pour y parvenir ?

2 votes

Bonne lecture : techrepublic.com/article/

0 votes

Vous me faites gagner du temps, tysm

211voto

David Points 2298

Pour obtenir DialogFragment en plein écran

Remplacer 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 : The-mystery-of-androids-full-screen-dialog-fragments

9 votes

Exactement ce qui fonctionne, mais j'ai essayé avec Videoview et cela ne fonctionne pas pour cela. La barre d'état s'affiche toujours. J'ai donc corrigé le code suivant : dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN) ;

1 votes

Enfin résolu, merci pour la suggestion @David

1 votes

Cela a bien fonctionné pour moi. J'ai utilisé ViewGroup.LayoutParams.WRAP_CONTENT pour la hauteur. Merci.

162voto

Chirag Nagariya Points 251
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setStyle(DialogFragment.STYLE_NORMAL,
             android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}

7 votes

La seule solution qui semblait fonctionner pour moi. Les autres solutions fonctionnaient parfois, parfois non. Espérons que je ne trouve pas d'exception à celle-ci aussi :)

14 votes

Si vous voulez que le fond soit transparent, vous devez utiliser '''Android.R.style.Theme_Translucent_NoTitleBar'''.

0 votes

Cette façon devrait être une réponse acceptée. Pas de piratage, pas de tricherie. Toutes les autres ne fonctionnent pas pour moi.

73voto

bradley4 Points 1220

Essayez de passer à un LinearLayout au lieu de RelativeLayout . Je visais l'api Honeycomb 3.0 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 le mises en page : 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>

0 votes

Et pour moi, j'avais besoin d'utiliser un RelativeLayout, mais la largeur du dialogue ne s'ajustait pas correctement au contenu, alors j'ai imbriqué le RelativeLayout dans un LinearLayout dont le seul enfant était le RelativeLayout... cela a déclenché les ajustements de largeur appropriés.

1 votes

J'ai tout testé, mais je peux confirmer que la seule chose qui a fonctionné pour mon DialogFragment a été d'envelopper toute ma mise en page dans un LinearLayout. De cette façon, je pouvais définir la largeur et la hauteur de ma mise en page d'origine (maintenant enveloppée)... J'ai perdu des heures sur ce problème.

7 votes

Le réglage de la largeur et de la hauteur minimales semble être la partie cruciale ; mais il s'agit d'un hack au lieu d'une solution propre. La réponse donnée par @David ci-dessous - expliquée plus en détail dans le lien qu'il donne - fonctionne également et est propre.

47voto

Ayman Mahgoub Points 505

Selon ce lien DialogFragment fullscreen montre un rembourrage sur les côtés ça va marcher comme sur des roulettes.

@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;
}

4 votes

Fonctionne très bien, même en 2018 ! (rien d'autre n'a fonctionné) Merci.

2 votes

C'est la réponse parfaite même dans Android Studio 3.1+ en 2018, mieux que d'autres réponses existent ici. L'autre réponse cassera l'interface utilisateur Android comme cardview, spinner, etc.

1 votes

Fonctionne de manière charmante en 2020 !

16voto

ruidge Points 361

J'ai rencontré ce problème auparavant en utilisant un dialogFragment en plein écran : il y a toujours un padding alors que le plein écran est activé. Essayez ce code dans la méthode onActivityCreated() du 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);
    }
}

0 votes

Cela fonctionne, d'autres solutions changent le thème des boutons et des autres éléments du fragment.

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