Android: comment créer un dialogue Sans Titre?

j'essaie de générer un dialogue personnalisé sur Android. Je crée mon dialogue comme ceci:

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

Tout fonctionne bien sauf le titre du dialogue. Même si Je ne règle pas le titre du dialogue, le dialogue popup a un espace vide à la position du dialogue.

y a-t-il un moyen de cacher cette partie du dialogue?

j'ai essayé avec un AlertDialog mais il semble que la disposition n'est pas réglée correctement:

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 nul à la dernière ligne. La boîte de dialogue n'est pas nulle, donc le TextView j'essaie de récupérer n'existe pas.

Si je décommente la partie où j'utilise le constructeur de dialogue tout fonctionne bien sauf pour le titre au-dessus de ma disposition de dialogue.

250
demandé sur GeneSys 2010-04-15 13:33:37

24 réponses

vous pouvez cacher le titre d'une boîte de dialogue en utilisant:

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 ya une bonne explication sur le site du développeur Android sur dialogue personnalisé .

en très bref résumé, vous faites cela avec le code comme copié ci-dessous à partir du site officiel. Cela prend un fichier layot personnalisé, le gonfle, lui donne du texte de base et l'icône, puis le crée. Vous le montreriez 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 que vous gonflez avec View view = inflater.... . Si c'est le cas, alors vous devez changer juste un peu: au lieu de dialog.findView... faire view.findView... . Ensuite, une fois que vous avez fait cela, n'oubliez pas d'utiliser dialog.show(), ou même constructeur.show () sans prendre la peine de faire builder.créer.)(

195
répondu Steve Haley 2015-07-31 11:25:51

FEATURE_NO_TITLE œuvres 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 il ne fonctionne pas lors de la création D'un AlertDialog (ou en utilisant le constructeur), parce qu'il désactive déjà le titre et utilise un personnalisé en interne.

j'ai regardé les sources SDK, et je pense que cela ne peut pas être travaillé autour. Donc, pour supprimer l'espacement supérieur, la seule solution est de créer un dialogue personnalisé à partir de zéro IMO, en utilisant la classe de dialogue directement.

Aussi, on peut le faire avec un style, par exemple, dans les styles.xml:

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

et ensuite:

Dialog dialog = new Dialog(context, R.style.FullHeightDialog);
581
répondu olivierg 2010-08-04 16:58:50

dans votre code ajouter cette ligne

requestWindowFeature(Window.FEATURE_NO_TITLE);  

ou en XML utiliser un thème

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

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

OK bon essai mais ça ne marche pas. Je obtenir: Android.vue.WindowManager $ BadTokenException: Impossible d'ajouter la fenêtre -- token null est pas pour une demande si je veux shwo la boîte de dialogue.

changez la boîte de dialogue Type alerte en boîte de dialogue système (par exemple TYPE_SYSTEM_OVERLAY ) et voyez si cela résout votre problème

67
répondu Donal Rafferty 2010-04-15 15:47:56

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

58
répondu alok tiwari 2017-07-27 11:34:35

utiliser le code ci-dessous avant setcontentview : -

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

Note : vous devez avoir le code ci-dessus, dans le même ordre et à la même ligne. requestWindowFeature doit être avant la ligne setContentView.

57
répondu duggu 2016-08-26 09:41:17

vous pouvez supprimer le titre par

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

où dialog est le nom de mon dialogue .

38
répondu shailendra 2012-01-27 04:25:29

dans votre code si vous utilisez requestWindowFeature(Window.FEATURE_NO_TITLE); assurez-vous qu'il va avant dialog.setContentView(); sinon il provoque l'application de planter.

29
répondu Szymon Morawski 2012-01-27 04:25:55

j'ai trouvé Trois Façon de le faire >

1) utilisant requestWindowFeature

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

2) Utiliser le 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) utilisant le thème XML dans AndroidManifest.xml

 android:theme="@android:style/Theme.NoTitleBar"
10
répondu Nirav Ranpara 2012-11-27 06:28:10

dans votre Custom_Dialog.classe java ajouter 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 
    }
}
10
répondu M_K 2015-11-19 23:52:45

la réponse d'olivierg a fonctionné pour moi et est la meilleure solution si la création d'une classe de dialogue personnalisé est la route que vous voulez prendre. Cependant, cela m'a dérangé que je ne pouvais pas utiliser le cours D'AlertDialog. Je voulais pouvoir utiliser le style par défaut du système AlertDialog. Créer une classe de dialogue personnalisée n'aurait pas ce style.

Donc j'ai trouvé une solution (hack) fonctionne sans avoir à créer une classe personnalisée, vous pouvez utiliser les constructeurs.

L'AlertDialog place une vue au-dessus de votre vue de contenu comme un espace réservé pour le titre. Si vous trouvez la vue et mettez la hauteur à 0, l'espace disparaît.

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

Voici deux méthodes d'aide 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 d'utilisation:

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

    showDialogWithNoTopSpace(yourCustomView, dialog, true);

si vous utilisez ceci avec un fragment de dialogue, outrepassez la méthode onCreateDialog du fragment de dialogue. Ensuite, Créez et retournez votre dialogue comme dans le premier exemple ci-dessus. Le seul changement est que vous devez passer false comme troisième paramètre (show) pour qu'il n'appelle pas show () dans la boîte de dialogue. Le DialogFragment s'en chargera plus tard.

exemple:

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

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

comme je le teste plus loin, je serai sûr de mettre à jour avec tous les ajustements supplémentaires nécessaires.

7
répondu cottonBallPaws 2017-05-23 12:10:30

Je ne sais pas si cette question est toujours d'actualité, mais dans mon cas, quand je suis passé du dialogue au DialogFragment,

requestWindowFeature(Window.FEATURE_NO_TITLE);

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

setStyle(STYLE_NO_TITLE, 0);

à la place avec le même résultat.

6
répondu Analizer 2013-03-12 13:13:38

définit le titre pour vider la chaîne en utilisant builder.

    Builder builder = new AlertDialog.Builder(context);
    builder.setTitle("");
...
    builder.show();
4
répondu Szere Dyeri 2012-02-28 21:30:18

définit l'attribut" gravity "sur l'ensemble de la boîte de dialogue À"center". Ensuite, vous devrez annuler ce paramètre pour tous les composants enfant dans la boîte de dialogue que vous ne voulez pas centré.

3
répondu Matt 2011-07-03 19:47:45
dialog=new Dialog(YourActivity.this, 1);  // to make dialog box full screen with out title.
dialog.setContentView(layoutReference);
dialog.setContentView(R.layout.layoutexample);
3
répondu Bamadeva 2012-02-15 15:13:43

en XML utiliser un thème

android:theme="@android:style/Theme.NoTitleBar"
3
répondu Asad Rao 2012-02-29 07:55:21

si on utilise simplement le dialogue sans le setTitle() , est-ce que ça va marcher pour enlever 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
répondu jad 2012-06-07 16:36:38

Pense que vous pouvez simplement utiliser ce maintenant:

AlertDialog dialog = new AlertDialog.Builder(this)
  .setView(view)
  .setTitle("")
  .create()
3
répondu J2K 2013-10-02 20:06:15

vous pouvez le faire sans utiliser AlertDialog en définissant une nouvelle classe qui s'étend de Dialog classe comme ceci:

public class myDialog extends Dialog {
    public myDialog(Context context) {
        super(context);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
    }
}
2
répondu Shqear 2014-09-08 17:00:58
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", 
                             "Loading. Please wait...", true);

crée un dialogue Sans Titre

2
répondu Praveen Kondapalli 2015-02-04 09:23:49
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
répondu Sandeep Kumar Patil 2015-02-04 09:24:26

en utilisant AlertDialog, sans utiliser setTitle() fait disparaître le titre

2
répondu kostikus 2015-08-04 07:09:07

après un tas de piratage, j'ai fait en sorte que ça marche:

            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);
1
répondu Chuck D 2012-12-07 22:37:10

voici quelque chose que vous pouvez faire avec AlertBuilder pour faire disparaître le titre:

TextView title = new TextView(this);
title.setVisibility(View.GONE);
builder.setCustomTitle(title);
1
répondu rundavidrun 2015-06-27 04:48:27

utiliser cette

    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);
1
répondu Habibur Rahman Ovie 2018-02-28 12:03:02