Android: Comment créer une boîte de dialogue sans titre?


269

J'essaie de générer une boîte de dialogue personnalisée dans Android. Je crée mon dialogue comme ceci:

dialog = new Dialog(this);
dialog.setContentView(R.layout.my_dialog);

Tout fonctionne bien sauf le titre de la boîte de dialogue. Même si je ne définit pas le titre de la boîte de dialogue, la fenêtre contextuelle de la boîte de dialogue a un espace vide à la position de la boîte de dialogue.

Existe-t-il un moyen de masquer cette partie de la boîte de dialogue?

Je l'ai essayé avec un AlertDialog mais il semble que la mise en page ne soit pas correctement définie:

LayoutInflater inflater = 
    (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.map_dialog, null);

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(view);

// dialog = new Dialog(this);
// dialog.setContentView(R.layout.map_dialog);

dialog = builder.create();

((TextView) dialog.findViewById(R.id.nr)).setText(number);

Si j'utilise ce code, j'obtiens une exception de pointeur nulle dans la dernière ligne. La boîte de dialogue n'est pas nulle, donc le TextView que j'essaie de récupérer n'existe pas.
Si je décommente la partie où j'utilise le constructeur de boîte de dialogue, tout fonctionne bien, sauf pour le titre au-dessus de ma disposition de boîte de dialogue.


7
@Janusz rechoose votre réponse à stackoverflow.com/a/3407871/632951
Pacerier

essayez stackoverflow.com/questions/6263639/… au lieu de la réponse précédente ... réponse simple
Mohammed mansoor

N'appelez simplement pas AlertDialog.Builder.setTitle () et votre boîte de dialogue apparaîtra sans titre.
marvatron

Réponses:


208

Vous pouvez masquer le titre d'une boîte de dialogue à l'aide de:

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);


Version précédente de cette réponse, qui est trop compliquée:

Vous devez utiliser un AlertDialog. Il y a une bonne explication sur le site du développeur Android à propos des boîtes de dialogue personnalisées .

En résumé, vous le faites avec du code comme copié ci-dessous sur le site officiel. Cela prend un fichier layot ​​personnalisé, le gonfle, lui donne du texte et une icône de base, puis le crée. Vous le montriez alors avec alertDialog.show().

AlertDialog.Builder builder;
AlertDialog alertDialog;

Context mContext = getApplicationContext();
LayoutInflater inflater = (LayoutInflater)
        mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_dialog,
        (ViewGroup) findViewById(R.id.layout_root));

TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("Hello, this is a custom dialog!");
ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.android);

builder = new AlertDialog.Builder(mContext);
builder.setView(layout);
alertDialog = builder.create();

En réponse au commentaire:

Je suppose que TextView avec l'ID nr est dans la vue avec laquelle vous gonflez View view = inflater..... Si c'est le cas, vous devez changer un seul bit: au lieu de le dialog.findView...faire view.findView.... Ensuite, une fois que vous avez fait cela, n'oubliez pas d'utiliser dialog.show (), ou même builder.show () sans vous soucier de faire builder.create ().


4
Je pense que vous avez peut-être mal lu la question? Janusz a déjà la boîte de dialogue personnalisée affichée et a juste besoin d'informations sur la suppression du titre
Donal Rafferty

17
Eh bien, selon la documentation officielle, "Une boîte de dialogue créée avec la classe Dialog de base doit avoir un titre. Si vous n'appelez pas setTitle (), l'espace utilisé pour le titre reste vide, mais toujours visible. Si vous ne le faites pas" Si vous voulez un titre, vous devez créer votre boîte de dialogue personnalisée à l'aide de la classe AlertDialog. " Je ne l'ai pas personnellement expérimenté, mais cela suggère que même en utilisant une disposition ou des thèmes de boîte de dialogue personnalisés, il est impossible de supprimer l'espace de titre.
Steve Haley

2
2e pensée: Je pense que nous comprenons le «titre» différemment. Je suppose qu'il parle de l'espace en haut de la fenêtre pop-up, pas du titre en haut de l'application.
Steve Haley

11
@SteveHaley, Non, il est possible de le cacher en utilisant la ligne suivantedialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Sami Eltamawy

1
Assurez-vous de faire dialog.requestWindowFeature (Window.FEATURE_NO_TITLE); AVANT de gonfler votre vue de dialogue.
Alexey Podlasov

585

FEATURE_NO_TITLE fonctionne lors de la création d'une boîte de dialogue à partir de zéro, comme dans:

Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

Mais cela ne fonctionne pas lors de la création d'un AlertDialog (ou de l'utilisation du Builder), car il désactive déjà le titre et en utilise un personnalisé en interne.

J'ai regardé les sources du SDK et je pense que cela ne peut pas être résolu. Donc, pour supprimer l'espacement supérieur, la seule solution consiste à créer une boîte de dialogue personnalisée à partir de zéro IMO, en utilisant directement la classe Dialog.

De plus, on peut le faire avec un style, par exemple dans styles.xml:

<style name="FullHeightDialog" parent="android:style/Theme.Dialog">
   <item name="android:windowNoTitle">true</item>
</style>

Puis:

Dialog dialog = new Dialog(context, R.style.FullHeightDialog);

Au lieu de créer une boîte de dialogue personnalisée à partir de zéro, j'ai créé le styles.xml comme suggéré par oliverg. Et puis, j'ai ajouté android: theme = "@ style / FullHeightDialog" à la déclaration <activity> ... </acitivity> dans le fichier Manifest. Ça a juste fonctionné. Merci ..
Indrajeet

@olivierg mais je veux un bouton avec une boîte de dialogue pleine hauteur. quelle est la solution?
Pacerier

1
Notez que la ligne requestWindowFeature doit être AVANT la ligne setContentView.
Fattie

Bien que cela réponde le mieux aux commentaires réels, la solution dans la réponse acceptée est la meilleure à mon avis. J'ai commencé à le faire comme ça, avec un nettoyage Dialog, mais créer un AlertDialogétait beaucoup plus facile. Comme il est indiqué dans les documents : The Dialog class is the base class for dialogs, but you should avoid instantiating Dialog directly. Instead, use one of the following subclasses: <AlertDialog and others described here>. Le AlertDialoggère également les éléments du cycle de vie et ok / cancel de manière simple.
Krøllebølle

67

Dans votre code ajoutez cette ligne

requestWindowFeature(Window.FEATURE_NO_TITLE);  

Ou en XML utilisez un thème

android:theme="@android:style/Theme.NoTitleBar"

XML serait une meilleure implémentation car avec la version du code, la barre de titre est créée puis supprimée, ce qui est un gaspillage de ressources

Bon essai mais ça ne marche pas. J'obtiens: android.view.WindowManager $ BadTokenException: Impossible d'ajouter une fenêtre - le jeton null n'est pas pour une application si je veux afficher la boîte de dialogue.

Modifiez le type de boîte de dialogue d'alerte en boîte de dialogue système (par exemple, TYPE_SYSTEM_OVERLAY) et voyez si cela résout votre problème


2
N'appelez pas setContentView () avant requestFeature ().
jlopez

61

Utilisez comme ceci:

Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 

Cela supprimera toute barre de titre de la fenêtre de dialogue.


3
N'appelez pas setContentView () avant requestFeature ().
jlopez

2
Comment puis-je le récupérer plus tard?
développeur Android

58

Utilisez le code ci-dessous avant setcontentview: -

    Dialog dialog = new Dialog(this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.setContentView(R.layout.custom_dialog);

Remarque : Vous devez avoir le code ci-dessus, dans le même ordre et la même ligne. requestWindowFeaturedoit être avant la ligne setContentView.


Lors de l'utilisation dans une boîte de dialogue, cette solution fonctionne mieux pour moi car la réponse acceptée crée un petit espace vertical entre le cadre de dialogue et la vue du contenu interne.
Sebastian Roth

38

vous pouvez supprimer le titre en

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

où dialogue est le nom de ma boîte de dialogue.


N'appelez pas setContentView () avant requestFeature ()
jlopez

29

Dans votre code, si vous utilisez, requestWindowFeature(Window.FEATURE_NO_TITLE); assurez-vous qu'il va avant, dialog.setContentView();sinon cela entraînera le blocage de l'application.


doute plutôt d'essayer avant et assez surpris que ça marche bien évidemment. car dans android.developer.com, ils ont dit clairement que c'est un must pour une boîte de dialogue personnalisée d'avoir un titre. : P
richardlin

10

J'ai trouvé Three Way pour ce faire>

1) Utilisation de requestWindowFeature

Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(dialog.getWindow().FEATURE_NO_TITLE); 

2) Utilisation du style (style.xml)

<style name="FullHeightDialog" parent="android:style/Theme.Dialog">
   <item name="android:windowNoTitle">true</item>
</style>

Dialog dialog = new Dialog(context, R.style.FullHeightDialog);

3) Utilisation du thème XML dans AndroidManifest.xml

 android:theme="@android:style/Theme.NoTitleBar"

1
La première méthode doit être dialog.requestWindowFeature (Window.FEATURE_NO_TITLE);
Jon Willis

10

Dans votre classe Custom_Dialog.java, ajoutez requestWindowFeature(Window.FEATURE_NO_TITLE)

public class Custom_Dialog extends Dialog {

    protected Custom_Dialog(Context context, int theme) {
        super(context, theme);
        // TODO Auto-generated constructor stub
        requestWindowFeature(Window.FEATURE_NO_TITLE); //This line 
    }
}

C'est la seule chose qui a fonctionné pour moi ... pour une raison quelconque, toutes les autres suggestions n'ont pas fonctionné. La seule chose que je recommanderais est de rendre le constructeur public et également de fournir l'autre constructeur Dialog qui ne prend qu'un contexte
Justin

7

La réponse d'Olivierg a fonctionné pour moi et est la meilleure solution si la création d'une classe de dialogue personnalisée est l'itinéraire que vous souhaitez emprunter. Cependant, cela me dérangeait de ne pas pouvoir utiliser la classe AlertDialog. Je voulais pouvoir utiliser le style par défaut du système AlertDialog. La création d'une classe de boîte de dialogue personnalisée n'aurait pas ce style.

J'ai donc trouvé une solution (hack) qui fonctionnera sans avoir à créer une classe personnalisée, vous pouvez utiliser les constructeurs existants.

Le AlertDialog place une vue au-dessus de votre vue de contenu en tant qu'espace réservé pour le titre. Si vous trouvez la vue et définissez la hauteur sur 0, l'espace disparaît.

J'ai testé cela sur 2.3 et 3.0 jusqu'à présent, il est possible que cela ne fonctionne pas encore sur toutes les versions.

Voici deux méthodes d'assistance pour le faire:

/**
 * Show a Dialog with the extra title/top padding collapsed.
 * 
 * @param customView The custom view that you added to the dialog
 * @param dialog The dialog to display without top spacing
     * @param show Whether or not to call dialog.show() at the end.
 */
public static void showDialogWithNoTopSpace(final View customView, final Dialog dialog, boolean show) {
    // Now we setup a listener to detect as soon as the dialog has shown.
    customView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {
            // Check if your view has been laid out yet
            if (customView.getHeight() > 0) {
                // If it has been, we will search the view hierarchy for the view that is responsible for the extra space. 
                LinearLayout dialogLayout = findDialogLinearLayout(customView);
                if (dialogLayout == null) {
                    // Could find it. Unexpected.

                } else {
                    // Found it, now remove the height of the title area
                    View child = dialogLayout.getChildAt(0);
                    if (child != customView) {
                        // remove height
                        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams();
                        lp.height = 0;
                        child.setLayoutParams(lp);

                    } else {
                        // Could find it. Unexpected.
                    }
                }

                // Done with the listener
                customView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
         }

    });

    // Show the dialog
    if (show)
             dialog.show();
}

/**
 * Searches parents for a LinearLayout
 * 
 * @param view to search the search from
 * @return the first parent view that is a LinearLayout or null if none was found
 */
public static LinearLayout findDialogLinearLayout(View view) {
    ViewParent parent = (ViewParent) view.getParent();
    if (parent != null) {
        if (parent instanceof LinearLayout) {
            // Found it
            return (LinearLayout) parent;

        } else if (parent instanceof View) {
            // Keep looking
            return findDialogLinearLayout((View) parent);

        }
    }

    // Couldn't find it
    return null;
}

Voici un exemple de la façon dont il est utilisé:

    Dialog dialog = new AlertDialog.Builder(this)
        .setView(yourCustomView)
        .create();

    showDialogWithNoTopSpace(yourCustomView, dialog, true);

Si vous l'utilisez avec un DialogFragment, remplacez la onCreateDialogméthode de DialogFragment . Ensuite, créez et renvoyez votre boîte de dialogue comme le premier exemple ci-dessus. Le seul changement est que vous devez passer false comme 3e paramètre (show) pour qu'il n'appelle pas show () dans la boîte de dialogue. DialogFragment s'en occupera plus tard.

Exemple:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new AlertDialog.Builder(getContext())
        .setView(yourCustomView)
        .create();

    showDialogWithNoTopSpace(yourCustomView, dialog, false);
    return dialog;
}

Au fur et à mesure que je testerai cela, je serai sûr de mettre à jour avec tous les réglages supplémentaires nécessaires.


Solution élégante, +1. Savez-vous comment l'utiliser dans un DialogFragment?
Binoy Babu

@Binoy a mis à jour la réponse pour DialogFragments (c'est en fait ainsi que je l'utilise personnellement)
cottonBallPaws

6

Je ne sais pas si cette question est toujours d'actualité, mais dans mon cas, lorsque je suis passé de Dialog à DialogFragment,

requestWindowFeature(Window.FEATURE_NO_TITLE);

n'était pas une option, mais je pouvais utiliser

setStyle(STYLE_NO_TITLE, 0);

au lieu de cela avec le même résultat.


Pour clarifier, cette ligne ( setStyle(STYLE_NO_TITLE, 0);) ira dans la méthode onCreate de votre classe DialogFragment.
Prix

4

Définissez le titre sur une chaîne vide à l'aide du générateur.

    Builder builder = new AlertDialog.Builder(context);
    builder.setTitle("");
...
    builder.show();

3

définissez l'attribut "gravité" sur l'ensemble de la boîte de dialogue sur "centre". Vous devrez ensuite remplacer ce paramètre par tous les composants enfants de la boîte de dialogue que vous ne souhaitez pas centrer.


3
dialog=new Dialog(YourActivity.this, 1);  // to make dialog box full screen with out title.
dialog.setContentView(layoutReference);
dialog.setContentView(R.layout.layoutexample);

3

en XML utiliser un thème

android:theme="@android:style/Theme.NoTitleBar"

3

Si nous utilisons simplement la boîte de dialogue sans le setTitle(), est-ce que ça va fonctionner pour supprimer l'espace du titre?

mUSSDDialog = new AlertDialog.Builder(context).setView(dialogView)
.setPositiveButton(R.string.send_button,DialogListener)
.setNegativeButton(R.string.cancel,DialogListener)
.setCancelable(false).create();

3

Pensez que vous pouvez simplement l'utiliser maintenant:

AlertDialog dialog = new AlertDialog.Builder(this)
  .setView(view)
  .setTitle("")
  .create()

2
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", 
                             "Loading. Please wait...", true);

crée une boîte de dialogue sans titre


2
public static AlertDialog showAlertDialogWithoutTitle(Context context,String msg) 
     {
      AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
      alertDialogBuilder.setMessage(msg).setCancelable(false)
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int id) {

         }
        });

       return alertDialogBuilder.create(); 
     }

2

Lorsque vous utilisez AlertDialog, ne pas utiliser setTitle()fait disparaître le titre


1

Après un tas de piratage, je l'ai fait fonctionner:

            Window window = dialog.getWindow();
            View view = window.getDecorView();
            final int topPanelId = getResources().getIdentifier( "topPanel", "id", "android" );
            LinearLayout topPanel = (LinearLayout) view.findViewById(topPanelId);
            topPanel.setVisibility(View.GONE);

ce qui est dialogici etgetResources()
Kartheek s

1

Vous pouvez le faire sans utiliser AlertDialogen définissant une nouvelle classe qui s'étend de la Dialogclasse comme ceci:

public class myDialog extends Dialog {
    public myDialog(Context context) {
        super(context);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
    }
}

1

Voici quelque chose que vous pouvez faire AlertBuilderpour faire disparaître le titre:

TextView title = new TextView(this);
title.setVisibility(View.GONE);
builder.setCustomTitle(title);

1

Utilisez ceci

    Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    dialog.setCancelable(true);
    dialog.setContentView(R.layout.image_show_dialog_layout);

0

dialog_custom .requestWindowFeature (Window.FEATURE_NO_TITLE);

cela supprimera le titre de la boîte de dialogue de découpe.

Notez ajouter ces lignes avant d'ajouter du contenu .. par exemple

     dialog_custom = Dialog(activity!!)
    dialog_custom.requestWindowFeature(Window.FEATURE_NO_TITLE)
    dialog_custom.setContentView(R.layout.select_vehicle_type)
    dialog_custom.setCanceledOnTouchOutside(false)
    dialog_custom.setCancelable(true)
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.