Dialogue En Plein écran dans Android

j'essaie de montrer un fragment de dialogue presque plein écran. Mais je suis de toute façon pas en mesure de le faire.

La façon dont je suis en train de montrer le Fragment est directement à partir de l'android developer documentation

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 mettre le Relativayout dans le fragment pour fill_parent et un peu de 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 saurais s'attendre à ce que le fragment de dialogue remplisse la majorité de l'écran. Mais Je ne semble redimensionner verticalement, mais seulement jusqu'à une largeur fixe à l'horizontale.

j'ai aussi 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 aide non plus.

j'ai probablement mal compris quelque chose à propos de la façon dont Android gère les dialogues, car je suis tout nouveau à elle. Comment puis-je faire quelque chose comme cela? Il n'existe aucun d'autres moyens pour atteindre mon objectif?


Appareil Android:

Asus EeePad Transformateur

Android 3.0.1


Maj: J'ai maintenant réussi à 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 vraiment besoin d'un petit "padding" autour de la boîte de dialogue pour afficher l'arrière-plan.

des idées pour y arriver?

120
demandé sur Jonik 2011-08-25 15:59:43

21 réponses

essayez de passer à un LinearLayout au lieu de RelativeLayout . Je ciblais 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 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> 

principal.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>
68
répondu bradley4 2016-06-13 08:38:29

pour obtenir DialogFragment sur plein écran

outrepasser onStart de votre fragment de dialogue 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 pour ce post: Le-mystere-de-android-plein écran-dialogue-fragments

132
répondu David 2014-10-02 14:42:08
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

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

}
105
répondu Chirag Nagariya 2013-04-26 10:46:25

selon ce lien DialogFragment fullscreen montre rembourrage 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;
}
29
répondu Ayman Mahgoub 2017-05-23 12:18:22

j'ai déjà rencontré le problème lors de l'utilisation d'un fragment de dialogue fullscreen: il y a toujours un rembourrage tout en ayant réglé fullscreen. 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
répondu ruidge 2014-04-07 17:42:39

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 un affichage en ligne 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 sur certains appareils Lollipop+ (par exemple Nexus 9).

il n'était pas évident mais finalement j'ai compris que pour le faire pleine largeur à travers tous les dispositifs et plates-formes fond de fenêtre doit être spécifié dans les 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é lorsque nous créons le 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
répondu goRGon 2015-07-23 20:57:29

dans la mesure où L'API Android a été mise à jour, la méthode suggérée pour afficher un dialogue 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 le faire de cette façon:

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

J'espère que ça aidera.

MODIFIER

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

alors je vous ai suggéré de changer simplement le style de votre fragment de dialogue 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 aidera.

10
répondu andrea.rinaldi 2017-02-17 12:05:48

Essayez d'utiliser setStyle() dans onCreate et remplacer onCreateDialog faire dialogue 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 juste outrepasser onCreate() et setStyle fellow le code.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);    
    setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme);        
}
9
répondu Jay Parker 2012-11-19 15:01:54

Faire un Plein écran DialogFragment en utilisant seulement 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. Ajouter à votre panier:

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

Alternative solution

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 styles.

8
répondu vovahost 2018-10-01 08:29:04

cela dépend en effet de la façon dont le layout est défini. Mais pour s'assurer que le dialogue obtienne la taille requise, la meilleure solution est de fournir les LayoutParams une fois que le dialogue est affiché (et pas sur la création). Sur un fragment de dialogue la boîte de dialogue est affichée sur la méthode onStart , ainsi une méthode valide pour obtenir la pleine largeur 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 endroit est sur le onCreate méthode:

@Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_Light_Dialog);
}
7
répondu coderazzi 2013-09-08 12:58:32

c'est la solution la façon dont j'ai pensé à cette question

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

        }
    }
2
répondu savepopulation 2014-10-05 21:40:35

dans le cas où quelqu'un d'autre vient à travers ceci, j'ai eu une expérience similaire à ceci mais il s'avère que le problème était que j'avais oublié de retourner la vue gonflée d'onCreateView (au lieu de retourner le super par défaut.onCreateView). J'ai simplement retourné la vue gonflée correcte et cela a résolu le problème.

1
répondu user1205577 2012-03-21 18:56:32

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

1
répondu Shoham Ben-Har 2013-04-20 06:27:00
@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 dialogue, qui est similaire au setStyle de Chirag dans onCreate. Un inconvénient est que savedInstanceState n'est pas utilisé.

1
répondu Xingang Huang 2015-08-13 16:30:54

essayez ce dialogue pour les fragments communs pour les utilisations multiples. Espérons que cela vous aidera bettor

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
répondu Dashrath Rathod 2016-08-23 12:54:56

C'est ce que vous devez définir pour fragmenter:

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

dans votre cas:

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

et pourquoi? Parce que DialogFragment (lorsqu'il n'est pas dit explicitement), utilisera ses styles internes qui envelopperont votre mise en page personnalisée en elle (pas d'écran complet, etc.).

et la disposition? Pas besoin d'une façon macabre, ça marche 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>

Profiter

1
répondu arenaq 2016-09-01 17:53:30

je suis très en retard pour répondre à cette question encore je veux partager cette réponse afin qu'à l'avenir tout le monde peut utiliser cela.

j'ai utilisé ce code dans mon projet, il fonctionne en version basse ainsi qu'une version plus récente.

il suffit D'utiliser ce thème à l'intérieur 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 que vous ne pouvez voir que ce thème est assez 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 faites-moi savoir si quelqu'un fait face à un problème. Espérons que cela est utile. Merci:)

1
répondu Biswajit 2017-06-26 10:52:30

la façon suivante fonctionnera même si vous travaillez sur un layout relatif. Suivez les étapes suivantes:

  1. Aller à l'éditeur de thème ( Disponible sous Outils-> Android -> Éditeur de Thème)
  2. sélectionner Afficher tous les thèmes. Sélectionnez celui avec AppCompat.Boîte de dialogue
  3. choisissez l'option arrière-plan de fenêtre android si vous voulez qu'il soit de tout fond coloré spécifique ou un dans la transparence.
  4. sélectionnez la couleur et appuyez sur OK.Sélectionnez un nom pour le nouveau thème.
  5. Aller à les styles.xml et puis sous le thème vient d'ajouter, ajouter ces deux attributs:

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

mon cadre de thème pour le dialogue est comme sous:

<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 thème .AppCompat.Boîte de dialogue Une autre façon serait juste faire un nouveau style dans les styles.xml et de le modifier selon le code ci-dessus.

  1. allez dans votre classe de Fragment de dialogue et dans la méthode onCreate () , définissez le style de votre dialogue comme:

    @Override le vide public sur la création (@Nullable Bundle savedincostate) { super.onCreate(savedInstanceState); setStyle (DialogFragment.STYLE_NORMAL,R. de style.Dialogthème); }

1
répondu Saumya Mehta 2017-06-29 13:32:51

créer 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éfinir le style dans DialogFragment

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogTheme);
}
1
répondu Zahra.HY 2017-12-02 09:07:29

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
répondu palindrom 2015-03-25 12:14:50

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

utilisant 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);
    }
}

utilisant 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
répondu Khemraj 2018-07-31 07:19:50