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?

AlejandroVK
la source
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;
}
a.bertucci
la source
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;
}
Max Ch
la source
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");
Mosiur
la source
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);
}
sonida
la source
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;
    }   
}
Zulfiqar
la source
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);
}
user2910855
la source