Comment créer un DialogFragment sans titre?


358

Je crée un DialogFragment pour afficher des messages d'aide concernant mon application. Tout fonctionne bien à part une chose: il y a une bande noire en haut de la fenêtre qui montre le DialogFragment, que je présume est réservé pour le titre, quelque chose que je ne veux pas utiliser.

Ceci est particulièrement douloureux car mon DialogFragment personnalisé utilise un fond blanc, donc le changement est beaucoup trop notoire pour être laissé de côté.

Permettez-moi de vous montrer cela de manière plus graphique:

entrez la description de l'image ici

Maintenant, le code XML de mon DialogFragment est le suivant:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:id="@+id/holding" 
        android:orientation="vertical" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:background="@drawable/dialog_fragment_bg"
        >
        <!-- Usamos un LinearLayout para que la imagen y el texto esten bien alineados -->
        <LinearLayout
            android:id="@+id/confirmationToast" 
            android:orientation="horizontal" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            >

            <TextView android:id="@+id/confirmationToastText" 
            android:layout_width="wrap_content"
            android:layout_height="fill_parent" 
            android:text="@string/help_dialog_fragment"
            android:textColor="#AE0000"
            android:gravity="center_vertical"
            />

        </LinearLayout>
        <LinearLayout
            android:id="@+id/confirmationButtonLL" 
            android:orientation="horizontal" 
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent"
            android:gravity="center_horizontal"
            >    
            <Button android:id="@+id/confirmationDialogButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:layout_marginBottom="60dp"
                android:background="@drawable/ok_button">
            </Button>
        </LinearLayout>
    </LinearLayout>
</ScrollView>

Et le code de la classe qui implémente DialogFragment:

public class HelpDialog extends DialogFragment {

    public HelpDialog() {
        // Empty constructor required for DialogFragment
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //Inflate the XML view for the help dialog fragment
        View view = inflater.inflate(R.layout.help_dialog_fragment, container);
        TextView text = (TextView)view.findViewById(R.id.confirmationToastText);
        text.setText(Html.fromHtml(getString(R.string.help_dialog_fragment)));
        //get the OK button and add a Listener
        ((Button) view.findViewById(R.id.confirmationDialogButton)).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                 // When button is clicked, call up to owning activity.
                HelpDialog.this.dismiss();
             }
         });
        return view;
    }

}

Et le processus de création dans l'activité principale:

/**
 * Shows the HelpDialog Fragment
 */
private void showHelpDialog() {
    android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
    HelpDialog helpDialog = new HelpDialog();
    helpDialog.show(fm, "fragment_help");
}

Je ne sais vraiment pas si cette réponse, liée à une boîte de dialogue, convient également à Android: comment créer une boîte de dialogue sans titre?

Comment puis-je me débarrasser de cette zone de titre?


cette méthode showHelpDialog est appelée à partir de la classe FragmentActivity ou Activity ??
Sjk

80
+1 ... Je pense que c'est la première fois que je ris en lisant une question lol
Jason Crosby

1
+1 pour le sens de l'humour. Votre explication graphique du problème était exactement ce que je ressentais à propos de ce problème!
Luis Artola

Réponses:


589

Ajoutez simplement cette ligne de code dans votre HelpDialog.onCreateView(...)

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);

De cette façon, vous demandez explicitement d'avoir une fenêtre sans titre :)


ÉDITER

Comme @DataGrahamet @Blundellsouligné les commentaires ci - dessous, il est plus sûr d'ajouter la demande d'une fenêtre moins le titre dans la onCreateDialog()méthode au lieu de onCreateView(). De cette façon, vous pouvez empêcher NPE ennuyeux lorsque vous n'utilisez pas votre fragment comme Dialog:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
  Dialog dialog = super.onCreateDialog(savedInstanceState);

  // request a window without the title
  dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
  return dialog;
}

61
Bien sûr, vous pouvez également utiliser la méthode pratique getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE)...
a.bertucci

8
Vous voudrez peut-être le faire dans onCreateDialog à la place, au cas où votre fragment ne serait pas affiché sous forme de boîte de dialogue.
DataGraham

2
@ a.bertucci vous êtes le meilleur! Cependant, si jamais vous ajoutez ce fragment en tant que fragment normal, getDialogvous retournerez un NPE
Blundell

4
Cela réduit la largeur de ma boîte de dialogue. Des solutions de contournement pour ce problème?
horloger

2
@clocksmith est l' android:layout_widthattribut de la vue racine dans la mise en page de votre boîte de dialogue défini sur wrap_content?
ataulm

78

Le fragment de boîte de dialogue possède la méthode setStyle, qui doit être appelée avant la création de la vue Java Doc . Le style de la boîte de dialogue peut également être défini avec la même méthode

public static MyDialogFragment newInstance() {
        MyDialogFragment mDialogFragment = new MyDialogFragment();
        //Set Arguments here if needed for dialog auto recreation on screen rotation
        mDialogFragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
        return mDialogFragment;
}

3
Max, j'ai essayé d'utiliser setStype (STYLE_NO_TITLE, 0). Mais le résultat est que ma boîte de dialogue est coupée à 1/4 de la largeur, donc le message dans la boîte de dialogue n'est pas affiché tout.
vliux

1
Je pense que les deux façons sont en fait les mêmes dans le code, en regardant les sources Android. J'ai aussi le même problème où il coupe 1/4 de la taille :(. Je ne l'ai pas encore résolu.
abhishekmukherg

1
C'est la meilleure façon de procéder.
Psypher

1
@Sam Vous avez raison, le style Window est conservé dans onSaveInstanceState et restauré par la suite. Je crois toujours que c'est une meilleure pratique pour tout initialiser dans onCreate () en général.
BladeCoder

1
Tous les enfants directs d'une vue racine de votre mise en page doivent avoir une largeur de match_parant. Ensuite, vous obtiendrez une boîte de dialogue avec une largeur normale.
nicolausOui

22
FragmentManager manager = getSupportFragmentManager();
SettingsDialog sd = new SettingsDialog();
sd.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
sd.show(manager, "settings_dialog");

1
sd.setStyle (DialogFragment.STYLE_NORMAL, android.R.style.Theme_Holo_Dialog_NoActionBar) Je dirais
Androider

OMG après tant d'épreuves, c'est la seule pièce qui a fonctionné.
Alex

16

Essayez de manière simple

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, 0);
}

Fonctionne bien sur Samsung Galaxy S4.
CoolMind

11
public class LoginDialog extends DialogFragment {   
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.login_dialog, null);
        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        return view;
    }   
}

10

Définissez le style sur Theme_Holo_Dialog_NoActionBar:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NORMAL, android.R.style.Theme_Holo_Dialog_NoActionBar);
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.